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

dnu*_*092 1 linux bash ssh sudo

我正在尝试使用 ssh 作为用户“USER2”从一台服务器“USER1”导航到另一台服务器。

ssh -t $hostname "sudo su - USER2; whoami; pwd"
Run Code Online (Sandbox Code Playgroud)

执行上述操作后,我能够以 USER2 的身份成功导航到服务器,但未执行尾随命令,即“whoami 和 pwd”。但是,在退出 ssh 会话时,USER1 在输出中呈现,然后是当前工作目录。

我不想对 ssh 已知主机文件进行任何更改。

Gil*_*il' 6

您正在sudo su - USER2; whoami; pwd远程主机上执行命令。让我们分解一下:

  • 以分号分隔的命令按顺序执行。因此sudo su - USER2首先执行命令;然后,当它完成时,whoami被执行,最后pwd被执行。
  • 该命令sudo su - USER2以用户 USER2 启动登录 shell。这个 shell 从标准输入读取命令,直到它被告知退出(例如使用exit内置命令)或直到它在标准输入上检测到文件结尾。由于标准输入连接到终端,它等待您输入命令。

如果要以 USER2 身份执行命令,则需要将它们作为参数传递给sudo. su在这里运行没有用,sudo 已经知道如何执行此操作。-t除非您想与远程命令交互,否则您不需要SSH 选项(这包括您需要为 sudo 键入密码的情况)。

ssh -t "$remotehost" 'sudo -i -u USER2 sh -c "whoami; pwd"'
Run Code Online (Sandbox Code Playgroud)

如果您的 sudo 配置只允许您以 root 身份运行程序,而不是任意用户(这不会改变任何安全方面的内容),那么您需要坚持使用sudo su. 在这种情况下,将-c选项传递su给运行指定的 shell 命令。

ssh -t "$remotehost" 'sudo su -c "whoami; pwd" USER2'
Run Code Online (Sandbox Code Playgroud)

如果您需要阅读用户的.profile,请明确这样做。

ssh -t "$remotehost" 'sudo su -c ". ~/.profile; whoami; pwd" USER2'
Run Code Online (Sandbox Code Playgroud)

或者,您可以将命令作为标准输入传递给交互式 shell。管道有点微妙,因为 ssh 的标准输入必须保留为终端。这种做法与此文件的一个优点是,在shell命令报价保持相对简单:逃逸'作为'\''远程外壳,是需要远程shell没有逃脱。

ssh -t "$remotehost" 'sudo su - USER2 <<\EOF
whoami
pwd
EOF'
Run Code Online (Sandbox Code Playgroud)