在bash脚本中获取SSH登录名

4
我在服务器A上有一个Bash脚本,它通过"logname"命令查找已登录的SSH用户,即使以"sudo"权限作为"root"运行也可以。如果我从桌面远程登录到服务器A并运行该脚本,则可以正常工作。
但是,我在SVN服务器S上设置了一个post-commit钩子,它会SSH到A并在那里运行该脚本,这会导致"logname"失败,并出现错误信息:"logname: no login name"。
如果我从桌面SSH到S,然后再从S SSH到A,它就可以正常工作,因此该错误必须是由于SVN钩子最终无法从虚拟终端运行而引起的。
那么,在这种情况下,我可以使用哪种替代"logname"的方法呢?

第三段,“如果我SSH进入R”:你是指进入S吗? - vergenzt
“man page”(手册页)中写道,logname 命令会检查 /var/run/utmp 中的登录名……不确定这是否有帮助。 - vergenzt
3个回答

3
使用id -nu命令获取用户名,不要使用繁琐的分支和切割操作。

2
sudo id -nu 打印出 root,所以这并没有用处。 - Bart van Heukelom
id -rnu 是否会打印真实 UID? - Jens

3
您可以使用 id 命令:
  $ ssh 192.168.0.227 logname
  logname: no login name

然而。
  $ ssh 192.168.0.227 id
  uid=502(username) gid=100(users) groups=100(users)

在bash脚本中,您可以使用类似以下的方式从id输出中剪切用户名:
  $ id | cut -d "(" -f 2 | cut -d ")" -f1
  username

为了让脚本在sudo环境和无终端的情况下都能正常工作,您可以根据条件执行不同的命令。
if logname &> /dev/null ; then 
    NAME=$( logname )
else 
    NAME=$( id | cut -d "(" -f 2 | cut -d ")" -f1 )
fi
echo $NAME

很遗憾,这个命令没有 logname 的跨 sudo 属性,即 ssh 192.168.0.277 sudo id => uid=0(root) gid=0(root) groups=0(root) - Bart van Heukelom
一个 if 语句可以工作,但我更喜欢使用 if [ logname works ] else $SUDO_USER,因为 $SUDO_USER 在两个 sudo 中无法生效。是否有可能进行 logname works 检查? - Bart van Heukelom
非常奇怪。我有 if logname &> /dev/null; then echo has logname。这会输出 "has logname" \n "logname: no login name"。 - Bart van Heukelom
不要紧,我的真实脚本(不是快速测试)相同的结构突然起作用了。更新:找到原因了。真实脚本是bash,而测试脚本是sh - Bart van Heukelom
2
简化版:NAME=$(logname 2>&- || id -un) 已翻译。 - bufh

3
这是我最终得到的结果。
if logname &> /dev/null; then
    human_user=$(logname)
else
    if [ -n "$SUDO_USER" ]; then
        human_user=$SUDO_USER
    else
        human_user=$(whoami)
    fi
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接