当使用 sudo 时,如何找到哪个用户执行脚本?

当使用 sudo 时,如何找到哪个用户执行脚本?

我想要的是当执行此脚本时,找到运行 bash 脚本的用户的名称。据我所知,唯一可能的方法是按以下方式解析( )sudo的输出:who -mwho am i

user@UbuntuServer:~$ cat who.sh 
#!/bin/sh
whoami
echo $USER
who -m | awk '{print $1}'

user@UbuntuServer:~$ sudo ./who.sh 
root
root
user

问题是:在 Ubuntu Desktop 16.04.4 中who -m什么who am i也不做。为什么?

在此处输入图片描述

另一个问题是为什么 Ubuntu 的在线手册页与在 Ubuntu 桌面版或服务器上执行的who有什么不同?man who

但这些问题对于我的目标来说并不那么重要。正如标题所述,主要问题是:如何找到使用时哪个用户执行了该脚本sudo


实际上,原标题是——如何在 Ubuntu 桌面上找到“我是谁”?- 是相同但错误的问题。

答案1

不久前我遇到过类似的问题,到目前为止对我来说唯一可靠的方法是:

echo ${SUDO_USER:-${USER}}

只要用户以自己的身份使用 shell, 就$USER包含其用户名。当他调用 时sudo,新的子 shell被设置为调用 shell 中$SUDO_USER的内容,当然就变成了。$USER$USERroot

运算符的诀窍在于,如果设置了,则:-整个表达式的计算结果为(因此在由 打开的子 shell 内),否则为。因此,您始终拥有正确的用户名,而不必担心表达式的计算上下文,我发现这很方便。$SUDO_USERsudo$USER

答案2

虽然解决方案Wanderer 提供的功能按预期工作,并且直接回答了这个问题,过去几年,当我想强制脚本由某些(系统)用户执行时,我使用特殊环境变量 Eeffective UID - $EUID

#!/bin/bash
SCRIPT_UID="33"
[[ $EUID -ne $SCRIPT_UID ]] && {
  echo "Please run as $(id $SCRIPT_UID -un), use: sudo -u $(id $SCRIPT_UID -un) $0"
  exit 1
}
echo "The script is running as $(id $EUID -un)."

相关内容