远程ssh命令执行切换用户

Switching users in remote ssh command execution

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

以下命令:

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")不行。

首先考虑 su 命令的作用:它启动一个新的 shell 作为目标用户。暂时忽略 ssh,在您的本地系统上变成 root 并尝试 运行ning 这样的事情:

su someuser; env

会发生什么?你会得到一个shell作为someuser,当你退出那个shell时,env命令在[=14=中执行]的环境。如果你想 运行 env 命令作为 someuser,你需要:

su someuser -c env

这指示 su 到 运行 env 命令作为 someuser

当你运行:

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

su 生成的 shell 立即退出,因为您禁用了标准输入(使用 -n),并且 env 命令在 root的环境,就像在这个例子中一样。