如何通过多个 sudo 和 su 命令找到原始用户?

新手上路,请多包涵

通过 sudo 或 su 运行脚本时,我想获取原始用户。这应该发生,无论多个 sudosu 在彼此内部运行,特别是 sudo su -

原文由 evan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 450
2 个回答

结果:

使用 who am i | awk '{print $1}'logname 因为不保证其他方法。

以自己的身份登录:

 evan> echo $USER
evan
evan> echo $SUDO_USER

evan> echo $LOGNAME
evan
evan> whoami
evan
evan> who am i | awk '{print $1}'
evan
evan> logname
evan
evan>

普通须藤:

 evan> sudo -s
root> echo $USER
root
root> echo $SUDO_USER
evan
root> echo $LOGNAME
root
root> whoami
root
root> who am i | awk '{print $1}'
evan
root> logname
evan
root>

须藤苏 - :

 evan> sudo su -
[root ]# echo $USER
root
[root ]# echo $SUDO_USER

[root ]# echo $LOGNAME
root
[root ]# whoami
root
[root ]# who am i | awk '{print $1}'
evan
[root ]# logname
evan
[root ]#

须藤苏-;苏汤姆:

 evan> sudo su -
[root ]# su tom
tom$ echo $USER
tom
tom$ echo $SUDO_USER

tom$ echo $LOGNAME
tom
tom$ whoami
tom
tom$ who am i | awk '{print $1}'
evan
tom$ logname
evan
tom$

原文由 evan 发布,翻译遵循 CC BY-SA 2.5 许可协议

没有 完美 的答案。当您更改用户 ID 时,通常不会保留原始用户 ID,因此会丢失信息。一些程序,例如 lognamewho -m 实现了一个 hack,他们检查哪个终端连接到 stdin ,然后检查登录的用户在那个终端上。

该解决方案 通常 有效,但并非万无一失,当然也不应该被认为是安全的。例如,假设 who 输出以下内容:

 tom     pts/0        2011-07-03 19:18 (1.2.3.4)
joe     pts/1        2011-07-03 19:10 (5.6.7.8)

tom 使用 su 进入根目录,然后运行你的程序。如果 STDIN 没有被重定向,那么像 logname 这样的程序将输出 tom 。如果它被重定向(例如从文件中):

 logname < /some/file

然后结果是“ no login name ”,因为输入不是终端。然而,更有趣的是,用户可以伪装成不同的登录用户。由于 Joe 在 pts/1 上登录,Tom 可以通过运行来假装是他

logname < /dev/pts1

现在,它说 joe 尽管运行命令的是汤姆。换句话说,如果你在任何类型的安全角色中使用这种机制,你就疯了。

原文由 tylerl 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题