Ssh

安全重啟多個遠端伺服器上的服務

  • August 9, 2021

我需要編寫一個腳本,以便我和我的同事可以在多台伺服器上重新啟動不同的服務。我們都使用 LDAP 連接到伺服器,所以我希望我的腳本將我們的 LDAP 使用者連接到伺服器,然後使用 sudo 重新啟動服務(我可以在每台伺服器上編寫一個腳本來重新啟動所有需要的服務)。現在腳本只需執行類似的命令

ssh -t user@host "sudo service XXX restart" 

問題在於,對於每台伺服器,腳本都會兩次詢問使用者密碼(一次用於 ssh 連接,兩次用於 sudo 命令)。我的第一個猜測是使用 read -s -p 提示使用者輸入登錄名和密碼,然後使用該變數自動使用 ssh 登錄。顯然,Expect 是執行此操作的方法,但我沒有找到在 Expect 腳本中安全地提示密碼或在 bash 腳本中提示密碼並在 expect 腳本中安全地傳遞變數的方法。

我確實查找了諸如 pssh、集群 ssh 之類的解決方案,這些解決方案似乎可以正常工作,但不適用於 sudo。我知道最好的方法是使用 ssh 密鑰,但由於多個使用者需要使用腳本,我想使用 LDAP 登錄名/密碼。

正如格倫在評論中建議的那樣,正確的方法是使用 stty :

# grab the password
stty -echo
send_user -- "Password for $user@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)

#... later
send -- "$pass\r"

引用自:https://serverfault.com/questions/1070880