Bash

具有文件管道的非根使用者 SSH 特權命令

  • May 9, 2019

我有一個禁用 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

此行授予使用者(而不是其他任何人)在沒有密碼請求的情況下以 rootuser身份執行(而不是其他任何東西)的權限。specialCommand嘗試執行任何其他命令sudo仍然需要像往常一樣輸入密碼。

在此之後,您應該能夠簡單地執行以下操作:

ssh -tt user@ip "sudo specialCommand" < commandInput

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