我正在尝试实现一种方法来确定哪个用户是某个进程会话的所有者,以尽可能跨平台的方式。
在 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)
- 获取
tty
名字即/dev/pts/0
- 使用 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);