【发布时间】:2011-04-01 03:25:47
【问题描述】:
如果我创建的脚本 /root/bin/whoami.sh 包含:
#!/bin/bash
whoami
这个脚本是由一个正确配置了 sudo 的用户调用的,它会指示
root
有没有一种快速的方法可以在脚本中获取实际用户,还是我必须求助于传递这个用户名的参数?
【问题讨论】:
如果我创建的脚本 /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 被调用多少次,它都可以正常工作。
【讨论】:
who am i 的替代品是 who mom likes。您的选择。
who 为我返回 2 行,都包含我的名字,who am i 没有返回。有什么帮助吗?
who am i 什么也没做,它似乎只是 who,所以 who | awk '{print $1}' 按预期工作;)
awk,你也可以使用cut:who mom likes | cut -d' ' -f1或sed,出于某种原因:who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
logname 在您从终端窗口运行时不起作用,因为它是一个非登录终端。
我认为$SUDO_USER 是有效的。
#!/bin/bash
echo $SUDO_USER
whoami
【讨论】:
sudo env 显示 SUDO_USER 但 sudo echo $SUDO_USER 什么也没打印...
sudo echo $SUDO_USER 中,bash 正在评估 $SUDO_USER 在执行 sudo 之前。试试这个解决方案中发布的脚本,它可以工作。
echo ${SUDO_USER:-$USER} 来捕获sudo 和非sudo 运行。但是evan's answerlogname 听起来更轻松
$SUDO_USER 不适用于 sudo su -,但 logname 始终有效。
无论是否使用 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)
不适合使用 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}' 将为您服务
【讨论】:
奇怪,系统确实区分了real and effective UIDs,但我找不到在 shell 级别导出它的程序。
【讨论】: