如何通过已打开的 ssh 连接运行多个 sudo 命令

如何通过已打开的 ssh 连接运行多个 sudo 命令

我正在尝试使用 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'

相关内容