如果我创建脚本
/root/bin/whoami.sh
包含:
#!/bin/bash
whoami
并且此脚本由具有正确配置的 sudo 的用户调用,它将指示
root
有没有一种快速的方法来获取脚本中的实际用户,或者我是否必须求助于传递此用户名的参数?
sudo su -
,则$SUDO_USER 不起作用。
$USER == 'root'
则得到 $SUDO_USER
。
使用
whoami
代替命令 who am i
。 这将运行针对当前会话过滤的 who
命令。 它为您提供的信息比您需要的更多。 因此,这样做只是为了获取用户:
who am i | awk '{print $1}'
或者(更简单)您可以使用
logname
。 它的作用与上面的语句相同。
这将为您提供登录会话的用户名。
无论
sudo
或 sudo su [whatever]
,这些都有效。 无论调用多少次 su
和 sudo
,它都可以工作。
我认为 $SUDO_USER 是有效的。
#!/bin/bash
echo $SUDO_USER
whoami
以下是如何获取调用脚本的人的用户名,无论是否使用 sudo:
if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi
或更短的版本
[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
此处不适合使用
whoami
、who am i
、who
、id
或 $SUDO_USER
。
实际上,
who
永远不能解决问题,因为它只会列出登录的用户,可能有几十个......
在我看来,唯一有价值的答案是使用
logname
。
希望这有帮助
罗布
如果这是您正在寻找的 UID(对于 docker 恶作剧很有用),那么这有效:
LOCAL_USER_ID=$(id -u $(logname))
who am i | awk '{print $1}'
对我不起作用,但是
who|awk '{print $1}'
将为工作服务
奇怪的是,系统确实区分了真实和有效的UID,但我找不到在shell级别导出它的程序。
这个答案旨在成为此处其他一些答案的“某种概要”。如果您有兴趣,我在这个search中找到了这个问答。
标题问题是:
在 sudo 调用的 Bash 脚本中识别用户AIU OP 提出的问题,他想获取使用
sudo myscript
启动脚本的“登录用户”的名称。
这里的几个答案对我有用 - 在我的系统(Debian“书虫”)上,但从一些评论来看,一些在我的系统上有效的答案对其他人不起作用。我构建了一个简单的脚本,对其他人可能有用,所以我将其添加到此处:
#!/usr/bin/env bash
# my $0 is tstr.sh
echo -e "'whoami' ===> $(whoami)"
echo -e "'who am i' ===> $(who am i)"
echo -e "'echo \$SUDO_USER' ===> $SUDO_USER"
echo -e "'logname' ===> $(logname)"
您可以以普通用户身份运行此程序,在
sudo tstr.sh
下、从
sudo su -
、从
sudo -i
等等:$ sudo tstr.sh
'whoami' ===> root
'who am i' ===> seamus pts/2 2024-11-18 06:12 (192.168.1.209)
'echo $SUDO_USER' ===> seamus
'echo $(logname)' ===> seamus
$ sudo su -
root@sys3a:~# cd /home/seamus && ./tstr.sh
'whoami' ===> root
'who am i' ===> seamus pts/2 2024-11-18 06:16 (192.168.1.209)
'echo $SUDO_USER' ===>
'logname' ===> seamus
$ exit && sudo -i && cd /home/seamus && ./tstr.sh
'whoami' ===> root
'who am i' ===> seamus pts/2 2024-11-18 06:18 (192.168.1.209)
'echo $SUDO_USER' ===> seamus
'logname' ===> seamus
似乎logname
是对这个问题最一致的答案。
who am i
给我的印象是一个
潜在麻烦的答案,b/c它最终会产生另一个
pts
以获得正确的答案......这可能会产生其他问题,具体取决于所使用的脚本的要求。
有同样的问题,使用 Rocky Linux 9.2,我运行了这个脚本:
在以下每种情况下:
作为用户 (
./script.sh
LOGNAME:用户名SUDO_USER:空
sudo ./script.sh
日志名称:根SUDO_USER:用户名
./script.sh
LOGNAME:用户名SUDO_USER:空
./script.sh
日志名称:根SUDO_USER:用户名
sudo
superuser
运行脚本:
#root: sudo ./script.sh
通过 su 或 sudo su 结果是
日志名称:根set
MAIL=/var/spool/mail/username
UNAME=$(echo $MAIL |cut -d/ -f5)
我确信在某些情况下这不起作用,但我还没有找到。