在远程ssh命令执行中切换用户

时间:2017-10-24 20:23:01

标签: ssh su

我想知道为什么在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")不起作用。

1 个答案:

答案 0 :(得分:2)

首先考虑su命令的作用:它启动一个新的shell作为目标用户。暂时忽略ssh,只需在本地系统上成为root并尝试运行如下内容:

su someuser; env

会发生什么?您将获得someuser的shell,当退出该shell时,env命令将在root的环境中执行。如果您想将env命令作为someuser运行,则需要:

su someuser -c env

这指示suenv的身份运行someuser命令。

当你跑步时:

sudo ssh -n root@server2 "su bob; env"

su生成的shell立即退出,因为您已禁用stdin(使用-n),并且env命令在root&#39中执行; s环境,就像在这个例子中一样。