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

Ваш выходной формат запущен для абзаца Perl, хлебайте:

pbsnodes|perl -n00le 'BEGIN{ $sum = 0 }
                 m{
                   state \s* = \s* free \s* \n 
                   procs \s* = \s* ([0-9]+)
                 }x 
                    and $sum += $1;
                 END{ print $sum }'

Примечание:

Это только работает, потому что идея Perl "абзаца" является блоком непустых строк, разделенных одной или несколькими пустыми строками. Если у Вас не было пустых строк между node разделы, это не работало бы.

См. также

4
28.12.2014, 19:27
3 ответа

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

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 не тот же владелец, что и владелец процесса, то вы запрещаете доступ.

1
27.01.2020, 21:00

Странно это не получил должного ответа раньше.

#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);
0
27.01.2020, 21:00

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

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

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

stat -c %U /dev/pts/0

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

1
27.01.2020, 21:00

Теги

Похожие вопросы