LINUX.ORG.RU

Помогите с курсачом


0

0

Есть задача: надо написать демона, который отслеживает перемещения юзера по каталам (только в консоле) и пишет пути в лог. Признаюсь честно, опыта программирования под линукс у меня почти что нет. Сам демон не проблема, проблема в определении каталога в котором находится юзер. Из досовского прошлого всплыла идея о перехвате системного вызова. Это как вообще реально сделать или нет (если реально, то как). Если нет, то буду благодарен за любые идеи.

★★

А по моему это утопия. Это вам не дос. Может через драйвер реально все это завернуть, но простое приложение, под простым юзером .... утопия.

Dead ★★★★
()

Замени стандартный cd на свой и забудь поро демона...

anonymous
()

есть такой вариант (годиться для FreeBSD):
допустим тебе известен PID процесса который надо отслеживать:
используя libkvm ты можешь иметь доступ к данным ядра
по пиду находить процесс который ему соответсвует - то есть ты полностью имеешь его struct proc cp;
в этом cp есть поле p_fd - таблица файловый дескрипторов .. выдераешь ее и делаешь так:
fdp = cp.p_fd;
struct vnode *vp = fdp->fd_cdir; /* внода текущий директории */
теперь тебе надо раскрутить весь клубок поддиректорий
делаеться это что то типа так:
char buf[100]
char *bp=buf+100;

for (vp = fdp->fd_cdir; vp != fdp_fd_rdir && vp != rootvnode;) {
  /* XXX checks */
  ncp = TAILQ_FIRST(&vp->v_cache_dst);
  /* XXX checks */
    
  for (i = ncp->nc_len -1 ; i >= 0; i--) {
     /* XXX checks like bp == buf */
     *--bp = ncp
  }
  /* XXX checks */
  *--bp = '/';
  vp = vp->v_dd;
}

такое сработало бы в ядре, а тебе придеться все значения надо будет выгребать через libkvm

вот тебе и будет имя текущего каталога .. сразу возникает несколько проблем
ты будешь знать не полный путь а от ближайщего маунта то есть например
у нас есть / и в нем на /mnt замаунтен допустим nfs раздел - так вот чувак допустим находиться в /mnt/x1/x2 .. с помощью того что я тебе написал ты выдернешь только /x1/x2 но это не проблема есть ты будешь проверять на то что внода является рутом какой то FS и следующюю в обработку ставить 
vp->v_mount->mnt_vnodecovered вместо vp->v_dd

lg ★★
()
Ответ на: комментарий от lg

Как я понял, под процессом понимается bash, sch или иной интерпретатор. Демон запускается при загрузке системы. Встает вопрос: как он сможет определить, что юзер залогинился и найти PID bash-a ???

spiro ★★
() автор топика

ты можешь вообще гулять по списку всех процессов - смотри в allproc

lg ★★
()

Тогда ещё дополнение;)
нужно написать свой... (как бы его назвать?) в общем подобие script(1)
оно открывает псевдотерминал и привязывает к нему shell.
- в таком случае ф-ии контроля переходов юзера можно сосредоточить в этой поделке, которая будет лидером сеанса (что решит вопрос привелегий)

Loki
()

вообще если разширять ты может сделать(под FreeBSD only) много snp (snoop device) и полностью контролировать ввод/вывод на любой терминал [см watch(8)].. тем самым ты можешь записывать шеловские сессии юзеров а потом их просматривать допустим с помощью ttyplay

lg ★★
()

почитай внимательно lkmpg - там пример модуля есть - который отслеживает открываемые заданным пользователем файлы

SadStork
()

Ну да, как я и говорил, драйвер (модуль) будет предпочтительней. Но естетственно все только под рутом :)

Dead ★★★★
()

можно еще lsof использовать :)

SadStork
()

>Из досовского прошлого всплыла идея о перехвате системного вызова. Это как вообще реально сделать или нет (если реально, то как).
реально, для этого специальная функция в ядре есть, толькo я ее не помню,
посмотри в сторону strace
strace -o x.log bash ; grep chdir x.log

Anonymous ★★★★★
()

Блин, бакланы, совсем тупите все. ld_preload, да?

anonymous
()

Еще одно: у препода стоит Red Hat 7.0. И все таки нужен демон. На другое он не согласен.

spiro ★★
() автор топика

ну юлин - напиши модуль и демона - пусть они между собой общаются

SadStork
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.