是否有“我是谁”和“登录名”的简单替代方法?

时间:2019-05-17 14:28:55

标签: linux shell command-line terminal

我注意到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 ilogname取决于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'`

1 个答案:

答案 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)