远程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
的环境,就像在这个例子中一样。
我想知道为什么在 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
的环境,就像在这个例子中一样。