在sudo调用的Bash脚本中标识用户

qua*_*ore 97 linux bash sudo

如果我创建/root/bin/whoami.sh包含以下内容的脚本

#!/bin/bash
whoami
Run Code Online (Sandbox Code Playgroud)

并且这个脚本由具有正确配置的sudo的用户调用,它将指示

root
Run Code Online (Sandbox Code Playgroud)

有没有快速的方法来获取脚本中的实际用户,还是我必须求助于传递此用户名的参数?

eva*_*van 122

如果您使用,$ SUDO_USER不起作用sudo su -.
它还需要多次检查 - 如果$USER == 'root'获得$SUDO_USER.

而不是命令whoami使用who am i.这将运行who为当前会话筛选的命令.它为您提供了比您需要的更多信息.所以,这样做只是为了得到用户:

who am i | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

或者(更简单)你可以使用logname.它与上述声明的作用相同.

这将为您提供登录到会话的用户名.

这些工作无论是sudosudo su [whatever].无论多少次su,它都可以工作sudo.

  • "我是谁"的替代品是"谁喜欢".你的选择. (38认同)
  • 我在Ubuntu 16.04和命令`我是谁`什么都不做,似乎只是`谁`,所以`谁| awk'{print $ 1}'`按预期工作;) (7认同)
  • `who`为我返回2行,都包含我的名字,而`who is i`则不返回.有帮助吗? (3认同)
  • 以防万一你没有安装`awk`,你也可以使用`cut`:`who mom likes | cut -d' ' -f1` 或 `sed` 出于某种原因:`妈妈喜欢谁 | sed -n 's/^\([^ ]*\).*/\1/p'` (3认同)
  • 是的,+ 1,"我是谁"才是答案. (2认同)

Bra*_*ley 51

我认为$ SUDO_USER是有效的.

#!/bin/bash
echo $SUDO_USER
whoami
Run Code Online (Sandbox Code Playgroud)

  • 工作,这并不奇怪,这是预期的.在`sudo echo $ SUDO_USER`中,bash在**执行sudo之前正在评估$ SUDO_USER**.尝试在此解决方案中发布的脚本,它的工作原理. (16认同)
  • 奇怪的事情:`sudo env` 显示`SUDO_USER` 但`sudo echo $SUDO_USER` 什么也没打印...... (2认同)
  • 您还可以使用`echo $ {SUDO_USER: - $ USER}`来捕获`sudo`和非sudo运行.但[evan的回答](http://stackoverflow.com/a/4597929/321973)`logname`听起来更容易 (2认同)
  • @TobiasKienzler - 正如埃文指出的那样,`$ SUDO_USER`不适用于`sudo su -`,但`logname`始终有效. (2认同)

Ale*_*ski 13

以下是如何获取调用脚本的人的用户名,无论是否为sudo:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi
Run Code Online (Sandbox Code Playgroud)

或更短的版本

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
Run Code Online (Sandbox Code Playgroud)

  • 甚至更短:`user = $ {SUDO_USER: - $(whoami)}`或[`user = $(logname)`](http://stackoverflow.com/a/4597929/321973) (8认同)

小智 8

此处不适合使用whoamiwho am iwhoid或。$SUDO_USER

实际上,who这永远不是问题的解决方案,因为它只会列出登录的用户,可能有几十个......

在我看来,唯一有价值的答案是使用logname.

希望这可以帮助


Jim*_*ker 5

如果它是您正在寻找的 UID(对于 docker 恶作剧很有用),那么这有效:

LOCAL_USER_ID=$(id -u $(logname))
Run Code Online (Sandbox Code Playgroud)