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


108

如果创建/root/bin/whoami.sh包含以下内容的脚本:

#!/bin/bash
whoami

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

root

有没有一种快速的方法来获取脚本中的实际用户,还是我不得不求助于该用户名传递的参数?

Answers:


134

如果您使用的是$ SUDO_USER,则无法使用sudo su -
它还需要进行多次检查-如果可以,$USER == 'root'则进行检查$SUDO_USER

代替命令whoami使用who am i。这将运行who为当前会话过滤的命令。它为您提供了比您所需更多的信息。因此,执行以下操作仅获得用户:

who am i | awk '{print $1}'

另外(更简单),您可以使用logname。它的作用与上述声明相同。

这为您提供了登录会话的用户名。

这些工作无论sudosudo su [whatever]。它也可以多少次,无论susudo被调用。


2
是的,+ 1 who am i是这里的答案。
乔·科尔尼

43
的替代方案who am iwho mom likes。你的选择。
wchargin

3
who为我返回2行,都包含我的名字,who am i但不返回。有什么帮助吗?
Hosh Sadiq 2014年

7
我在Ubuntu 16.04上,该命令who am i不执行任何操作,这似乎很简单who,因此who | awk '{print $1}'可以按预期工作;)
daveoncode

1
万一您尚未awk安装,也可以使用cutwho mom likes | cut -d' ' -f1sed出于某些原因: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez

56

我认为$ SUDO_USER是有效的。

#!/bin/bash
echo $SUDO_USER
whoami

1
奇怪的事情:sudo env显示SUDO_USERsudo echo $SUDO_USER什么也没印出来……
Job

17
工作,这并不奇怪,这是预料之中的。在中sudo echo $SUDO_USER,bash 执行sudo 之前评估$ SUDO_USER 。试试这个解决方案中发布的脚本,它可以工作。

@quadmore:如果您对答案感到满意,请不要忘记接受它。
工作

2
您也可以同时echo ${SUDO_USER:-$USER}捕获sudo非运行状态和非运行状态。但是埃文的答案 logname听起来更轻松
轻松

2
@TobiasKienzler-正如evan指出的那样,$SUDO_USER它与不兼容sudo su -,但logname始终有效。
大卫·哈克斯尼斯

13

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

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

或更短的版本

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

8
甚至更短:user=${SUDO_USER:-$(whoami)}user=$(logname)
Tobias Kienzler



1

使用whoamiwho am iwhoid$SUDO_USER是不是就在这里。

其实, who这绝不是解决问题的方法,因为它只会列出已登录的用户,可能是几十个...

在我眼中,唯一有价值的答案是使用 logname

希望这可以帮助


0

如果这是您要查找的UID(对docker shenanigans有用),则可以使用:

LOCAL_USER_ID=$(id -u $(logname))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.