我想要的是当执行此脚本时,找到运行 bash 脚本的用户的名称。据我所知,唯一可能的方法是按以下方式解析( )sudo
的输出:who -m
who 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
$USER
root
运算符的诀窍在于,如果设置了,则:-
整个表达式的计算结果为(因此在由 打开的子 shell 内),否则为。因此,您始终拥有正确的用户名,而不必担心表达式的计算上下文,我发现这很方便。$SUDO_USER
sudo
$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)."