Ssh
如何在 ssh 上使用 sudo 執行任意複雜的命令?
我有一個只能以我的使用者名 (myuser) 登錄的系統,但我需要以其他使用者 (scriptuser) 的身份執行命令。到目前為止,我已經想出了以下內容來執行我需要的命令:
ssh -tq myuser@hostname "sudo -u scriptuser bash -c \"ls -al\""
但是,如果當我嘗試執行更複雜的命令時,例如
[[ -d "/tmp/Some directory" ]] && rm -rf "/tmp/Some directory"
我很快就會遇到引用問題。我不確定如何將這個範例複雜命令傳遞給bash -c
,當\"
已經劃定了我正在傳遞的命令的邊界時(所以我不知道如何引用 /tmp/Some 目錄,其中包含一個空格。是否有一個通用的解決方案允許我通過任何命令,無論引用多麼複雜/瘋狂,或者這是我已經達到的某種限制?還有其他可能的,也許更易讀的解決方案嗎?
我有時使用的一個技巧是使用 base64 對命令進行編碼,並將其通過管道傳輸到另一個站點上的 bash:
MYCOMMAND=$(base64 -w0 script.sh) ssh user@remotehost "echo $MYCOMMAND | base64 -d | sudo bash"
這將使用安全字元串中的任何逗號、反斜杠、引號和變數對腳本進行編碼,並將其發送到其他伺服器。(
-w0
需要禁用換行,預設情況下發生在第 76 列)。另一方面,$(base64 -d)
將解碼腳本並將其提供給 bash 以執行。無論腳本多麼複雜,我都沒有遇到任何問題。解決了轉義的問題,因為你不需要轉義任何東西。它不會在遠端主機上創建文件,您可以輕鬆執行極其複雜的腳本。