遠端 shell 腳本 輸入密碼
如何在不輸入密碼的情況下執行腳本以登錄遠端伺服器並執行遠端 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 代理設置時,在每個會話中使用命令(或私鑰的任何路徑)向代理註冊一次你的密鑰。在此之後,您可以在會話的剩餘部分中使用該密鑰而無需提示。