我想知道为什么su在ssh命令中执行似乎没有在执行后续命令之前具有切换用户的预期效果,如下图所示:
以下命令:
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")不起作用。
首先考虑该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)
这指示su将env命令作为someuser.
当你运行时:
sudo ssh -n root@server2 "su bob; env"
Run Code Online (Sandbox Code Playgroud)
由 产生的 shellsu立即退出,因为您已禁用 stdin(使用-n),并且env命令在root的环境中执行,就像在本例中一样。
| 归档时间: |
|
| 查看次数: |
4852 次 |
| 最近记录: |