我想知道为什么在su
命令中执行ssh
似乎没有在执行后续命令之前切换用户所需的效果,如下所示:
以下命令:
bob@server1:~$ sudo ssh -n root@server2 "su bob; env"
产生以下输出:
...
USER=root
PWD=/root
HOME=/root
LOGNAME=root
...
我希望输出能反映出哪个用户bob会观察到,但是它是root用户的环境。但是,我发现以下命令可以达到预期的效果:
bob@server1:~$ sudo ssh -n root@server2 "su bob -c \"env\""
此命令产生以下输出:
...
USER=bob
PWD=/root
HOME=/users/bob
LOGNAME=bob
...
我想了解为什么第一种方式(执行"su bob; env"
)不起作用。
答案 0 :(得分:2)
首先考虑su
命令的作用:它启动一个新的shell作为目标用户。暂时忽略ssh,只需在本地系统上成为root
并尝试运行如下内容:
su someuser; env
会发生什么?您将获得someuser
的shell,当退出该shell时,env
命令将在root
的环境中执行。如果您想将env
命令作为someuser
运行,则需要:
su someuser -c env
这指示su
以env
的身份运行someuser
命令。
当你跑步时:
sudo ssh -n root@server2 "su bob; env"
由su
生成的shell立即退出,因为您已禁用stdin(使用-n
),并且env
命令在root
&#39中执行; s环境,就像在这个例子中一样。