我正在尝试使用 ssh 作为用户“USER2”从一台服务器“USER1”导航到另一台服务器。
ssh -t $hostname "sudo su - USER2; whoami; pwd"
执行上述命令后,我能够以 USER2 身份成功导航到服务器,但尾随命令(即“whoami 和 pwd”)未执行。但是,在退出 ssh 会话时,USER1 在输出中呈现,后跟当前工作目录。
我不想对 ssh 已知主机文件进行任何更改。
答案1
您正在sudo su - USER2; whoami; pwd
远程主机上执行该命令。让我们分解一下:
- 以分号分隔的命令按顺序执行。因此命令
sudo su - USER2
首先被执行; then,当它完成时,whoami
被执行,最后pwd
被执行。 - 该命令
sudo su - USER2
以用户 USER2 身份启动登录 shell。该 shell 从标准输入读取命令,直到被告知退出(例如使用exit
内置命令)或直到它检测到标准输入上的文件结尾。由于标准输入已连接到终端,因此它会等待您键入命令。
如果您想以 USER2 身份执行命令,则需要将它们作为参数传递给sudo
.运行su
在这里没有用, sudo 已经知道如何执行此操作。-t
除非您想与远程命令交互(这包括需要输入 sudo 密码的情况),否则您不需要SSH 选项。
ssh -t "$remotehost" 'sudo -i -u USER2 sh -c "whoami; pwd"'
如果您的 sudo 配置仅允许您以 root 身份运行程序,而不是以任意用户身份运行程序(这不会改变任何安全方面的内容),那么您需要坚持使用sudo su
.在这种情况下,将-c
选项传递给su
运行指定的 shell 命令。
ssh -t "$remotehost" 'sudo su -c "whoami; pwd" USER2'
如果您需要读取用户的.profile
,请明确执行。
ssh -t "$remotehost" 'sudo su -c ". ~/.profile; whoami; pwd" USER2'
或者,您可以将命令作为标准输入传递到交互式 shell。由于 ssh 的标准输入必须保留在终端,因此管道有点微妙。使用此处文档的这种方法的优点是 shell 命令中的引用仍然相对简单:对于远程 shell'
来说,转义是不需要的。'\''
ssh -t "$remotehost" 'sudo su - USER2 <<\EOF
whoami
pwd
EOF'