Linux

如何在已打開的 ssh 連接上執行多個 sudo 命令

  • July 9, 2015

我正在嘗試使用 ssh 作為使用者“USER2”從一台伺服器“USER1”導航到另一台伺服器。

ssh -t $hostname "sudo su - USER2; whoami; pwd"

執行上述操作後,我能夠以 USER2 身份成功導航到伺服器,但未執行尾隨命令,即“whoami 和 pwd”。但是,在退出 ssh 會話時,USER1 在輸出中呈現,然後是目前工作目錄。

我不想對 ssh 已知主機文件進行任何更改。

您正在sudo su - USER2; whoami; pwd遠端主機上執行命令。讓我們分解一下:

  • 用分號分隔的命令按順序執行。因此命令sudo su - USER2首先執行;然後,當它完成時,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 的標準輸入必須保留在終端上。使用 here 文件的這種方法的一個優點是在 shell 命令中的引用仍然相對簡單:對於遠端 shell 進行轉義''\''遠端 shell 不需要轉義。

ssh -t "$remotehost" 'sudo su - USER2 <<\EOF
whoami
pwd
EOF'

引用自:https://unix.stackexchange.com/questions/214629