首页 > 解决方案 > 是否有“我是谁”和“登录名”的简单替代方法?

问题描述

我注意到 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:id在使用 sudo 命令运行的脚本中使用$HOME、$USER 并返回不正确值的解决方案。who am ilogname依赖于终端并不总是更新的 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'`

标签: linuxshellcommand-lineterminal

解决方案


您的问题没有明确定义,因为如果XY不起作用,那么Z起作用的机会有多大?这完全取决于您尝试处理的精确故障模式,并且您的问题中没有任何内容可以揭示您需要这种情况的具体情况。

顺便说一句,也许看看 POSIXid命令,它具有显式选项,分别用-ror打印真实(登录)或有效(在任何 setuid 命令之后)用户 ID -u。当然,它获取此信息的确切方式没有指定,并且将保持依赖于实现,因此在您的特定情况下可能会或可能不会在您的平台上工作。

顺便说一句,这是对代码的重构,以避免使用两个单独的变量污染变量名称空间。

LOGIN_NAME=$(awk 'NR==FNR { val=$0; next } 
    $3==val{print $1}' /proc/self/loginuid FS=":" /etc/passwd)

推荐阅读