【问题标题】:Identify user in a Bash script called by sudo在 sudo 调用的 Bash 脚本中识别用户
【发布时间】:2011-04-01 03:25:47
【问题描述】:

如果我创建的脚本 /root/bin/whoami.sh 包含:

#!/bin/bash
whoami

这个脚本是由一个正确配置了 sudo 的用户调用的,它会指示

root

有没有一种快速的方法可以在脚本中获取实际用户,还是我必须求助于传递这个用户名的参数?

【问题讨论】:

    标签: linux bash sudo


    【解决方案1】:

    如果您使用sudo su -,$SUDO_USER 将不起作用。
    它还需要多次检查 - 如果 $USER == 'root' 则获取 $SUDO_USER

    使用who am i 代替命令whoami。这将运行为当前会话过滤的who 命令。它为您提供了比您需要的更多的信息。所以,这样做只是为了获取用户:

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

    或者(更简单)您可以使用logname。它与上述语句的作用相同。

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

    无论sudosudo su [whatever],这些都有效。无论susudo 被调用多少次,它都可以正常工作。

    【讨论】:

    • who am i 的替代品是 who mom likes。您的选择。
    • who 为我返回 2 行,都包含我的名字,who am i 没有返回。有什么帮助吗?
    • 我在 Ubuntu 16.04 上,命令 who am i 什么也没做,它似乎只是 who,所以 who | awk '{print $1}' 按预期工作;)
    • 如果你没有安装awk,你也可以使用cutwho mom likes | cut -d' ' -f1sed,出于某种原因:who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
    • 注意:logname 在您从终端窗口运行时不起作用,因为它是一个非登录终端。
    【解决方案2】:

    我认为$SUDO_USER 是有效的。

    #!/bin/bash
    echo $SUDO_USER
    whoami
    

    【讨论】:

    • 奇怪的事情:sudo env 显示 SUDO_USERsudo echo $SUDO_USER 什么也没打印...
    • 工作,这并不奇怪,这是意料之中的。在sudo echo $SUDO_USER 中,bash 正在评估 $SUDO_USER 执行 sudo 之前。试试这个解决方案中发布的脚本,它可以工作。
    • @quadmore:如果您对答案感到满意,请不要忘记接受它。
    • 您也可以使用echo ${SUDO_USER:-$USER} 来捕获sudo 和非sudo 运行。但是evan's answerlogname 听起来更轻松
    • @TobiasKienzler - 正如埃文指出的那样,$SUDO_USER 不适用于 sudo su -,但 logname 始终有效。
    【解决方案3】:

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

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

    或更短的版本

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

    【讨论】:

    【解决方案4】:

    不适合使用 whoamiwho am iwhoid$SUDO_USER

    实际上,who 从来都不是问题的解决方案,因为它只会列出已登录的用户,可能有几十个...

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

    希望对你有帮助

    罗伯

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 不在一个有多个用户会话的主机上
        【解决方案7】:

        奇怪,系统确实区分了real and effective UIDs,但我找不到在 shell 级别导出它的程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-23
          • 1970-01-01
          • 1970-01-01
          • 2013-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多