如果我创建脚本/root/bin/whoami.sh
包含:
#!/bin/bash
whoami
如果这个脚本是由已经正确配置sudo的用户调用的,它会指示
root
有没有一种快速获取脚本中实际用户的方法,还是我必须通过传递该用户名来解决问题?
如果你使用sudo su -
,那么$SUDO_USER将不起作用。
另外需要进行多个检查-如果$USER == 'root'
,则获取$SUDO_USER
。
使用命令who am i
代替whoami
。这会运行过滤了当前会话的who
命令。它提供了比你所需更多的信息。所以,要只获取用户,请执行以下操作:
who am i | awk '{print $1}'
另外(也更简单的方法)是使用logname
。它与上述语句执行的操作相同。
这将提供登录会话的用户名。
无论是否使用sudo
或sudo su [whatever]
,这些都适用。它也适用于su
和sudo
被调用的次数。
我认为$SUDO_USER是有效的。
#!/bin/bash
echo $SUDO_USER
whoami
sudo env
显示 SUDO_USER
但是 sudo echo $SUDO_USER
没有输出任何内容... - mtvecsudo echo $SUDO_USER
中,Bash 在执行 sudo 之前就已经评估了 $SUDO_USER。尝试此解决方案中发布的脚本,它会起作用。 - user410344echo ${SUDO_USER:-$USER}
来同时捕获sudo和非sudo运行。但是 evan's answer 中的 logname
更容易理解。 - Tobias Kienzler$SUDO_USER
在使用sudo su -
时无法工作,但是logname
始终有效。 - David Harkness无论使用 sudo 还是不使用 sudo,以下方法都可以获取调用脚本的用户名:
if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi
或者一个更短的版本
[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
user=${SUDO_USER:-$(whoami)}
或者是 user=$(logname)
。详见链接:https://dev59.com/73A75IYBdhLWcg3wAUB9#4597929。 - Tobias Kienzler使用 whoami
、who am i
、who
、id
或 $SUDO_USER
并不是正确的方法。
实际上,who
从来都不是解决问题的方法,因为它只会列出已登录的用户,可能有数十个...
在我看来,唯一有价值的答案是使用 logname
。
希望这个能有所帮助。
罗布
LOCAL_USER_ID=$(id -u $(logname))
who am i | awk '{print $1}'
对我来说不起作用,但是who|awk '{print $1}'
可以完成任务。
whoami
,不是who am i
。这遵循了典型的结构,其中shell命令通常是单个单词,后跟参数。 who am i
将被解释为运行带有am
和i
参数的who
命令。 who
碰巧也是一个命令,但在这种情况下输出的内容比所需的要多,而whoami
只打印用户名。 - Eli Smithwhoami
无法解决问题,因为它不会通过root查找调用者。 - undefined我有同样的问题,使用Rocky Linux 9.2,我运行了这个脚本:
#!/bin/bash
echo "LOGNAME: $LOGNAME"
echo "SUDO_USER: $SUDO_USER"
set | grep username
作为用户(./script.sh
)
通过sudo以root身份运行(sudo ./script.sh
)
通过su以root身份运行(./script.sh
)
通过sudo su以root身份运行(./script.sh
)
使用if...then...else检查会起作用,除非您在已经处于超级用户提示符的情况下意外地使用sudo
运行脚本:
#root: sudo ./script.sh
然而,一个set
变量在我所有的场景中都被证明是一致的:
MAIL=/var/spool/mail/username
我现在将已登录用户设置为:
UNAME=$(echo $MAIL |cut -d/ -f5)
我相信有时可能会出现这种方法行不通的情况,但是我还没有找到这样的例子。
who
命令返回两行,都包含我的名字,而who am i
命令则返回空。有什么帮助吗? - GManzawk
,也可以使用cut
命令:who mom likes | cut -d' ' -f1
或者出于某些原因使用sed
命令:who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
- Yzmir Ramirezlogname
不起作用,因为它是非登录终端。 - Lucas