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

Jon*_*rpe 3 ssh su

我想知道为什么sussh命令中执行似乎没有在执行后续命令之前具有切换用户的预期效果,如下图所示:

以下命令:

bob@server1:~$ sudo ssh -n root@server2 "su bob; env"
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

...
USER=root
PWD=/root
HOME=/root
LOGNAME=root
...
Run Code Online (Sandbox Code Playgroud)

我希望输出反映用户 bob 会观察到的内容,但它是 root 用户的环境。但是,我发现以下命令达到了预期的效果:

bob@server1:~$ sudo ssh -n root@server2 "su bob -c \"env\""
Run Code Online (Sandbox Code Playgroud)

此命令产生以下输出:

...
USER=bob
PWD=/root
HOME=/users/bob
LOGNAME=bob
...
Run Code Online (Sandbox Code Playgroud)

我想了解为什么第一种方式(执行"su bob; env")不起作用。

lar*_*sks 6

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

su someuser; env
Run Code Online (Sandbox Code Playgroud)

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

su someuser -c env
Run Code Online (Sandbox Code Playgroud)

这指示suenv命令作为someuser.

当你运行时:

sudo ssh -n root@server2 "su bob; env"
Run Code Online (Sandbox Code Playgroud)

由 产生的 shellsu立即退出,因为您已禁用 stdin(使用-n),并且env命令在root的环境中执行,就像在本例中一样。