我正在尝试检查当前的 shell 会话是否在登录会话中运行su
。
测试这种情况的最佳方法是什么?
答案1
查看logname
命令。logname 将打印 utmp 日志提供的登录控制终端的用户的用户名。
tk-mbp:~ tkennedy$ id -g -rn
staff
tk-mbp:~ tkennedy$ id -u -rn
tkennedy
tk-mbp:~ tkennedy$ logname
tkennedy
tk-mbp:~ tkennedy$ su -
Password:
tk-mbp:~ root# id -g -rn
wheel
tk-mbp:~ root# id -u -rn
root
tk-mbp:~ root# logname
tkennedy
这个例子如果来自Mac OS X,所以命令的使用id
可能与其他操作系统不同,但是,日志名的使用在Mac OS X、Linux和Solaris之间是一致的,这些都是我晚上可以测试的操作系统和。
通过使用 logname,您可以假设如果命令返回的用户id
是不是与 返回的用户相同logname
,则当前 shell 会话正在 su、sudo 或允许在 shell 中更改权限的其他工具下运行。
答案2
如果你想测试当前shell是否被执行su
:
[ "$(ps -o comm= $PPID)" = "su" ]
如果您想测试用户su
在登录后是否调用,那么在许多(但不是全部)系统上,您可以将LOGNAME
(通常在初始登录时设置)与USER
or id -un
(标识当前用户)进行比较。请注意,这LOGNAME
很容易被欺骗(它是一个环境变量)。但是,其他解决方案也是如此(例如,将根据进程名称对任何解决方案ln -s /bin/su ~/sh; ~/sh
隐藏)。su
答案3
这是我连接的一种解决方案:
pstree -p $$ |
grep -oP '[r]oot su .*(\w+)' |
sed -n -E 's/.* ([[:alnum:]]+)$/\1/p'`
树使用 -p 标志列出当前 shell 进程 PID ($$) 的祖先树
grep查找包含“root su”的行(我使用 [r] 技巧来避免返回 grep 进程本身)
sed清理结果并在行末尾仅打印当前用户名。 (如果它能打印父进程的用户,那就会更有帮助。)