在管理 Linux 服务器(例如 Debian 服务器)时,我经常切换用户。有时,我会将多个用户切换串联在一起:
aluriak$ sudo -s
root$ […]
root$ su aluriak
aluriak$ […]
aluriak$ su db
db$ […]
db$ <ctrl-D>
aluriak$ su front
front$ […]
有什么方法可以让我获取通过这种方式创建的“用户链”吗?
在上面的例子中,该假设的实用程序将输出类似的内容front aluriak root aluriak
,因为我是前端用户,从 aluriak 用户登录,他自己从 root 帐户登录,而他本身是从 aluriak 帐户访问的。
假设你只想要当前活动的进程链,你也可以使用
pstree -s -u $$
来自手册
pstree
页:这将列出父进程——正是这里所需要的。
再次强调——这正是我们想要的。
pstree -s -u $$
Ubuntu 22 系统上的示例输出:请注意,新用户名列在进程名称后的括号中,而不是手册页所述的 UID。在 Centos 7 和 RHEL 9 实例上进行的快速测试显示了相同的行为 - 发出的是用户名而不是 UID。
如果需要,您可以添加
-p
添加 pid 的选项。pstree -p -s -u $$
同样是在 Ubuntu 22 系统上的示例输出:一个解决方案是查看系统的身份验证日志,例如
/var/log/auth.log
,获取如下行:由于日志按时间排序,因此可以追溯登录/注销操作,并列出每个步骤。信息
pts/1
提供了会话编号,以避免混淆两个会话。您可以使用 获取您的会话tty
。除非您已完成,否则答案是可追溯的。它将在项目的和字段中显而易见。
/var/log/audit/audit.log
systemctl disable | stop> auditd
UID
AUID
exe=/usr/bin/su
以及
/var/log/secure
{在 RHEL 8 中} 的su:session
行因为这是 Linux,所以您有一个
/proc
文件系统。如果您有权访问其他进程的条目(通常,如果您成为 root 用户),那么您可以检查SUDO_*
每个祖先进程环境中的变量。这些变量由以下方式设置
sudo
:SUDO_COMMAND
SUDO_GID
SUDO_HOME
SUDO_UID
SUDO_USER
我们感兴趣的是
SUDO_USER
。因此,我们只需要检查父进程链以找到
SUDO_USER
更改值的位置。然后反转结果以tac
显示当前用户最后: