Определить владельца сеанса процесса

Я пытаюсь реализовать способ определить, какой пользователь является владельцем сеанса какого-либо процесса, таким образом, чтобы он был максимально кросс-платформенным.

В Linux я могу отслеживать pty процесса, следуя ссылке /proc/PID/fd/0 -> /dev/pts/31 и глядя, кто является владельцем этого терминала в файле utmp. Как мне это сделать, скажем, в AIX 6.1? /proc/PID/fd содержит файлы символов, а не символические ссылки, как это делает Linux … Также какова точная структура одной записи в файле utmp в AIX 6.1? Пытался прочитать его, используя 7.1 [ http://www-01.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.files/utmp.h.htm] структуры utmp, но он не подходит для шаблона.

Может быть, я более упрощаю, но, можете ли вы просто сделать это?

 ps -p <pid> -F tty 

Вот пример:

 $ ps -p 6947010 PID TTY TIME CMD 6947010 pts/0 0:00 ksh $ ps -p 6947010 -F tty= pts/0 

Вот как вы можете определить, разрешить или запретить доступ к определенному процессу:

Сначала вы определяете, кто владеет процессом и какое устройство pts запустило его, используя:

 $ ps -p <PID> -F tty=,user= pts/X <username> 

Затем вы проверяете владельца устройства pts / X, например:

 $ ls -l /dev/pts/X crw--w--w- 1 <username> <group> 21, 0 Apr 18 13:27 /dev/pts/0 

Если владелец / dev / pts / X совпадает с владельцем процесса, тогда процесс был запущен пользователем входа в систему, и вы предоставите доступ, если владелец устройства / dev / pts / X не совпадает с владелец процесса, то вы отказываетесь от доступа.

Если есть точки, я предполагаю, что это интерактивно, т. Е. Псевдотерминал, например, привязанные точки. Я использую это в моем аудиторе bash на серверах, он даст вам имя пользователя, даже если пользователь сделал sudo su - для переключения на root, например.

 stat -c %U $(tty) 
  1. Получить имя tty ie /dev/pts/0
  2. Использование stat, получить имя владельца файла

После того, как оболочка расширяет $(tty) она выглядит ниже

 stat -c %U /dev/pts/0 

Если бы вы были в ls -l /dev/pts вы могли видеть владельцев всех псевдотерминалов.

Странно, что раньше он не отвечал должным образом.

 #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> int main(int argc, char **argv) { struct stat sb; stat(argv[1], &sb) printf("%d\n", sb.st_uid); } 

Он переносится между U * x и избегает utmp. Поздно, но может помочь другим.

Если вам нужно имя пользователя:

 #include <pwd.h> ... printf("%s\n", getpwuid(sb.st_uid)->pw_name);