Ssh

遠端 shell 腳本 輸入密碼

  • December 22, 2012

如何在不輸入密碼的情況下執行腳本以登錄遠端伺服器並執行遠端 ssh 命令?

例如:

當我登錄到遠端伺服器並執行git pull命令時,我看到ssh提示我輸入密碼:

$ git pull origin master
Enter passphrase for /home/v3ed2/.ssh/id_rsa:

輸入密碼後,我將繼續執行該命令。

我想執行一個腳本,該腳本將登錄到遠端伺服器並為我執行命令。我已經嘗試過這個腳本:

ssh ve "cd clients/ ; git pull"

但是,當腳本執行時,它不會提示我輸入密碼。該腳本只是在等待我的密碼時掛起,但是當我嘗試輸入密碼時,出現錯誤:

bash: line 1: [REDACTED]: command not found    

當您在沒有命令的情況下執行 ssh 時,它會在伺服器端設置一個偽終端並在該終端中執行一個互動式 shell。當您傳遞一個命令時,該命令的輸入和輸出直接連接到 SSH 通道執行,沒有遠端終端。如果您通過該-t選項,則會在遠端端創建一個終端,您將收到一個密碼提示,您可以在其中輸入密碼。

ssh -t ve "cd clients/ ; git pull"

但是,這不是一種方便的方法。方便的方法是在本地電腦上執行 SSH 代理,然後轉發該代理的連接。

首先,您需要在第二個連接(到 git 伺服器)上使用公鑰認證,而不是密碼認證。你已經這樣做了,所以我不會更詳細地介紹。

/home/v3ed2/.ssh/id_rsa將第二台伺服器(在中間機器上)的私鑰複製到本地機器。或者,在 git 伺服器上,授權您在本地電腦上擁有私鑰的公鑰。或者,首先執行ssh -t ve ssh-add .ssh/id_rsa以向本地代理註冊中間機器的密鑰。

一些發行版和桌面環境已經設置了 SSH 代理。檢查你是否有一個執行ssh-add -l. 如果這告訴您沒有代理正在執行,您需要在會話中啟動一個。執行ssh-agent your-session-manager而不是直接呼叫your-session-manager,或者eval $(ssh-agent)在會話啟動腳本中執行,或者在 GUI 配置中勾選“執行 SSH 代理”複選框。您需要做兩件事:啟動ssh-agent程序,並獲取SSH_AUTH_SOCK它設置或列印到會話環境中的變數。如何執行此操作的詳細資訊非常特定於您的發行版和桌面環境。

在本地執行 SSH 代理後,請確保它已被轉發。預設情況下它可能會或可能不會被轉發。執行ssh ev ssh-add -l檢查代理是否轉發。如果不是,請將該行添加ForwardAgent yes到您的本地~/.ssh/config.

如果您在本地執行帶有 PuTTY 的 Windows,它也帶有一個密鑰代理,Pageant。有關說明,請參閱PuTTY 手冊

ssh-add ~/.ssh/id_rsa當你有一個工作的 SSH 代理設置時,在每個會話中使用命令(或私鑰的任何路徑)向代理註冊一次你的密鑰。在此之後,您可以在會話的剩餘部分中使用該密鑰而無需提示。

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