我注意到RHEL 8和Fedora 30无法正确更新utmp文件。
结果是,诸如“我是谁”,“最后一个”,“ w”等命令打印出不正确的结果(我实际上是不打印任何内容)
经过一番谷歌搜索后,我发现在这种情况下可以工作的'logname',但我读到gnome完全放弃了对utmp的支持,因此直到它停止工作也是一个时间问题。
我编写了以下脚本来查找用户的登录名(即使他在运行命令时就使用了sudo),但是它太复杂了,因此我在寻找替代方法。
LOGIN_UID=$(cat /proc/self/loginuid)
LOGIN_NAME=$(awk -v val=LOGIN_UID -F ":" '$3==val{print $1}' /etc/passwd)
是否有一个简单的替代方法,它不基于/ var / run / utmp的正确更新?
编辑1:无效的解决方案在已通过sudo命令运行的脚本中使用时,$ HOME,$ USER和id
返回的值不正确。 who am i
和logname
取决于utmp,而utmp并不总是由终端更新。
有效的解决方案:经过一番搜索,在https://unix.stackexchange.com/users/5685/frederik-deweerdt对自己答案的评论中找到了一种比上述方法更简单的方法
包含答案的答案链接:https://unix.stackexchange.com/a/74312
答案1
stat -c "%U" $(tty)
在https://stackoverflow.com/a/51765389/10630167
找到第二个答案答案2
`pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1 | sed 's/[()]//g'`
答案 0 :(得分:0)
您的问题定义不明确,因为如果 X 和 Y 不起作用, Z 起作用的机会是什么?这完全取决于您尝试处理的精确故障模式,您的问题中没有任何内容可以揭示您需要此故障的具体情况。
不妨使用POSIX id
命令,该命令具有显式选项,可以使用-r
打印真实(登录)或有效(在任何setuid命令之后)的用户ID,或者-u
。当然,没有具体说明它获取此信息的确切方法,并且将取决于实现,因此在您的特定情况下可能会或可能不会在您的平台上起作用。
顺便说一句,这是对代码的重构,以避免用两个单独的变量污染变量名空间。
LOGIN_NAME=$(awk 'NR==FNR { val=$0; next }
$3==val{print $1}' /proc/self/loginuid FS=":" /etc/passwd)