确定进程会话的所有者

确定进程会话的所有者

我正在尝试实现一种方法来确定哪个用户是某个进程会话的所有者,以尽可能跨平台的方式。

在 Linux 中,我可以通过跟踪链接/proc/PID/fd/0 -> /dev/pts/31并在 utmp 文件中查找谁是该终端的所有者来跟踪进程的 pty。例如,在 AIX 6.1 中如何执行此操作?/proc/PID/fd包含 char 文件,而不是像 Linux 那样包含符号链接...另外,AIX 6.1 上 utmp 文件中单个条目的确切结构是什么?尝试使用 7.1 阅读它[http://www-01.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.files/utmp.h.htm]utmp 结构,但它并不真正适合该模式。

答案1

如果有 pts,我假设它是交互式的,即像附加的 pts 这样的伪终端。我在服务器上的 bash 审核器中使用它,即使用户确实sudo su -切换到 root,它也会为您提供用户名。

stat -c %U $(tty)
  1. 获取tty名字即/dev/pts/0
  2. 使用 stat 获取文件所有者名称

shell展开后$(tty)如下所示

stat -c %U /dev/pts/0

如果您愿意,ls -l /dev/pts您可以看到所有伪终端的所有者。

答案2

也许我过于简单化了,但是,你能做到这一点吗?

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 设备的所有者与进程所有者不同进程的所有者,然后您拒绝访问。

答案3

奇怪的是,之前没有得到适当的回应。

#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);

相关内容