Bash
具有文件管道的非根使用者 SSH 特權命令
我有一個禁用 root 登錄的 SSH 伺服器。我希望執行一個特權命令,該命令需要在執行後從我擁有的文件中輸入。我希望通過 oneliner 命令或腳本在沒有使用者互動的情況下完成所有操作
有密鑰身份驗證設置,因此僅在執行命令時才需要以下密碼。
我得到的最接近的是這個
echo "mypass" |ssh -tt user@ip "sudo specialCommand"
輸出看起來像
mypass [sudo] password for user: specialCommand requests inputfile contents
mypass 之前列印,也接受密碼提示
commandInput
在接受密碼後,我有我試圖通過管道輸入的文件我的各種嘗試都只是一場猜謎遊戲,但都失敗了,我該如何做到這一點?
如果您
specialCommand
並不真正需要 tty,並且您被迫ssh
只為sudo
密碼提示製作一個,那麼另一種選擇是:(echo "mypass" ; cat commandInput) | ssh user@ip "sudo -Sp '' specialCommand"
選項使其從標準輸入讀取密碼
-S
,在這種情況下sudo
來自您的密碼echo "mypass"
,而選項-p ''
確保不顯示密碼提示。然後,您可能希望將密碼單獨放在一個文件中,並受適當權限的保護。這通常比在腳本中硬連線密碼更好。該命令將變為:
cat passwordFile commandInput | ssh user@ip "sudo -Sp '' specialCommand"
在後一種情況下,請確保密碼文件恰好是僅包含密碼的一行,沒有其他內容,否則密碼行之後的內容會污染您的
specialCommand
.
怎麼樣:
(echo "mypass"; cat commandInput) | ssh -tt user@ip "sudo specialCommand"
或者,既然您顯然可以
sudo
訪問遠端主機,那麼如何使用visudo
那裡將此行添加到/etc/sudoers
(在授予密碼sudo
訪問權限的現有行之後user
)的最後?user ALL=(root) NOPASSWD: /full/path/of/specialCommand
此行授予使用者(而不是其他任何人)在沒有密碼請求的情況下以 root
user
身份執行(而不是其他任何東西)的權限。specialCommand
嘗試執行任何其他命令sudo
仍然需要像往常一樣輸入密碼。在此之後,您應該能夠簡單地執行以下操作:
ssh -tt user@ip "sudo specialCommand" < commandInput