假设,在 Solaris 服务器上,user1
登录,切换到其他用户(例如sruser
,使用 id )su -
,然后启动 id 进程X
。然后另一个用户user2
登录,切换到sruser
相同的方式并启动 id 的进程Y
。 (多个用户可以同时登录和切换sruser
。)
X
在上面的场景中,我们有什么方法可以跟踪 ids和的进程Y
到实际用户user1
和user2
吗?
我们如何追踪进程到原始用户?
答案1
有生成进程树的命令。 'ps' 采用选项 'fu' ,我认为 Sun 有 ptree。
答案2
没有标准的方法,据我所知,Solaris 也没有方法。如果有一种可靠的方法来找出“祖先”用户,那么 root 可以执行所有操作的常见 UNIX 安全模型就不再成立。
您可以递归地检查每个进程的父进程。 (警告,未经测试的脚本。)
pid=$1 pids=$pid user=
while pid=$(ps -o ppid= $pid); do
user=$(ps -o ruser= $pid)
case $user in
0|root) :;;
*) break;;
esac
done
echo $user
但这并不能保证给出任何结果。也许父进程的父进程已经退出。
您可以检查进程正在哪个终端运行 ( ps -o tty= $pid
) 并检查最后登录该终端的人员 ( who
, last
)。但这只是指示性的:root 可以在任何终端上启动进程。
如果 user1 运行,您希望看到什么su user2 -c 'su user1 -c …'
?可以想象,操作系统将跟踪与进程相关的内核数据结构中的连续身份验证链,但这与通常的 UNIX 安全模型相去甚远。