Linux
如何在已打開的 ssh 連接上執行多個 sudo 命令
我正在嘗試使用 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'