linux - 是否有“我是谁”和“登录名”的简单替代方法?
问题描述
我注意到 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 i
并logname
依赖于终端并不总是更新的 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'`
解决方案
您的问题没有明确定义,因为如果X和Y不起作用,那么Z起作用的机会有多大?这完全取决于您尝试处理的精确故障模式,并且您的问题中没有任何内容可以揭示您需要这种情况的具体情况。
顺便说一句,也许看看 POSIXid
命令,它具有显式选项,分别用-r
or打印真实(登录)或有效(在任何 setuid 命令之后)用户 ID -u
。当然,它获取此信息的确切方式没有指定,并且将保持依赖于实现,因此在您的特定情况下可能会或可能不会在您的平台上工作。
顺便说一句,这是对代码的重构,以避免使用两个单独的变量污染变量名称空间。
LOGIN_NAME=$(awk 'NR==FNR { val=$0; next }
$3==val{print $1}' /proc/self/loginuid FS=":" /etc/passwd)
推荐阅读
- openshift-3 - 为什么 openshift 在我创建服务帐户时会创建两个秘密
- reactjs - 如何防止组件在 QR 扫描后重新渲染?
- ios - TestLab for iOS 中的 Flutter 集成测试 - iOS 中不划分用例
- kubernetes - 当您触发 Kubectl apply 命令时,背景会发生什么?
- python - 将 Panda 行转换为 Django 模型的最有效方法
- mongodb - 在 Kubernetes(EKS)中设置 mongo 时主机无法访问
- php - 检查电子邮件是否在 json 对象中
- spring - spring boot 父版本如何选择
- javascript - vanilla JS子模块的笑话错误:SyntaxError:无法在模块外使用导入语句
- react-native - 如果在背景上拖慢,Giftedchat 滚动不起作用