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

问题描述 投票:0回答:9

如果我创建脚本

/root/bin/whoami.sh
包含:

#!/bin/bash
whoami

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

root

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

linux bash sudo
9个回答
171
投票
如果您使用

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
,它都可以工作。


68
投票

我认为 $SUDO_USER 是有效的。

#!/bin/bash
echo $SUDO_USER
whoami

15
投票

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

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

或更短的版本

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`

8
投票

此处不适合使用

whoami
who am i
who
id
$SUDO_USER

实际上,

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

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

logname

希望这有帮助

罗布


5
投票

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

LOCAL_USER_ID=$(id -u $(logname))

2
投票

who am i | awk '{print $1}'
对我不起作用,但是
who|awk '{print $1}'
将为工作服务


1
投票

奇怪的是,系统确实区分了真实和有效的UID,但我找不到在shell级别导出它的程序。


0
投票

这个答案旨在成为此处其他一些答案的“某种概要”。如果您有兴趣,我在这个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,我运行了这个脚本:


-1
投票

在以下每种情况下:

作为用户 (

./script.sh
    )
  • LOGNAME:用户名

    SUDO_USER:空
    • 通过 sudo 作为 root (
    sudo ./script.sh
  • )
  • 日志名称:根

    SUDO_USER:用户名
    • 通过 su (
    ./script.sh
  • )
  • 作为 root

    LOGNAME:用户名

    SUDO_USER:空
    • 通过 sudo su (
    ./script.sh
  • ) 作为 root
  • 日志名称:根

    SUDO_USER:用户名
    • 使用 if...then...else 检查会起作用,除非您在已经处于
    sudo
  • 提示符时无意中
superuser

运行脚本:

#root: sudo ./script.sh

通过 su 或 sudo su 结果是
日志名称:根
  • SUDO_USER:根
    • 然而,一个
    set
  • 变量已被证明在我的所有场景中都是一致的:

MAIL=/var/spool/mail/username

我现在将登录用户设置为:

UNAME=$(echo $MAIL |cut -d/ -f5)

我确信在某些情况下这不起作用,但我还没有找到。

	

© www.soinside.com 2019 - 2024. All rights reserved.