获取bash脚本中的SSH登录名

获取bash脚本中的SSH登录名,bash,ssh,Bash,Ssh,我在服务器a上有一个Bash脚本,它通过logname命令查找登录的SSH用户,即使它是以root和sudo运行的。如果我从桌面SSH到服务器A,并运行脚本,它工作正常 但是,我已经在SVN服务器S上设置了一个post-commit钩子,SSH将其放入a中,并在那里运行脚本,这会导致logname失败,错误为“logname:无登录名” 如果我从桌面SSH到S,然后从那里SSH到A,它工作正常,因此错误一定是SVN钩子最终不会从虚拟终端运行 我可以在这里使用logname的替代方法吗?您可以使用

我在服务器a上有一个Bash脚本,它通过
logname
命令查找登录的SSH用户,即使它是以
root
sudo
运行的。如果我从桌面SSH到服务器A,并运行脚本,它工作正常

但是,我已经在SVN服务器S上设置了一个post-commit钩子,SSH将其放入a中,并在那里运行脚本,这会导致logname失败,错误为“logname:无登录名”

如果我从桌面SSH到S,然后从那里SSH到A,它工作正常,因此错误一定是SVN钩子最终不会从虚拟终端运行


我可以在这里使用
logname
的替代方法吗?

您可以使用
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

这就是我的结局

if logname &> /dev/null; then
    human_user=$(logname)
else
    if [ -n "$SUDO_USER" ]; then
        human_user=$SUDO_USER
    else
        human_user=$(whoami)
    fi
fi

使用
id-nu
。没有愚蠢的分叉和切割来获取用户名。

第三段,“如果我SSH到R”:你的意思是到S吗?说明
logname
检查
/var/run/utmp
中的登录名。。。不确定这是否有用。不幸的是,它没有
logname
的交叉sudo属性,即
ssh 192.168.0.277 sudo id
=>
uid=0(root)gid=0(root)groups=0(root)
一个
if
可以工作,但我更愿意做
if[logname起作用]或者$sudo\u USER
,因为$SUDO_用户无法生存两次
SUDO
s。是否有
logname工作
检查可能?非常奇怪。我有
if logname&>/dev/null;然后echo有logname
。这将输出“has logname”\n“logname:no login name”更不用说,在我的真实脚本(不是快速测试)中,相同的构造突然起作用。更新:找出原因。真正的脚本是
bash
,而测试脚本是
sh
。较短的版本:
NAME=$(logname 2>&-|id-un)
sudo id-nu
打印
root
,所以这没有用。那么
id-rnu
是否打印真正的UID?