Bash
如何在腳本執行期間呼叫 ssh 密鑰密碼提示?
在我的 ssh_config 文件中,同一伺服器上的站點有多個條目,例如:
Host site1 HostName 123.1.1.1 User myuser Port 13245 GSSAPIAuthentication no IdentityFile /home/myuser/.ssh/id_dsa Host site2...
我使用密碼保護密鑰來登錄遠端伺服器,這工作正常。但是,我正在嘗試創建一些使用 rsync 同步文件的 bash 腳本,並希望腳本提示我輸入密碼,然後執行 rsync 命令。ssh-agent 似乎是我想要使用的,但我很難弄清楚。我正在尋找類似…
HOST="site1:" SRC=/var/foo DEST=/home/bar SYNC=(rsync "$SRC" "$HOST""$DEST"...)# rsync /var/foo site1:/home/bar... read -r -p "Are you sure? [y/N] " response response=${response,,} if [[ $response =~ ^(yes|y)$ ]] then #check to see if the passphrase exists from prior execution of this script. if [ no ];then #use ssh-add to prompt for passphrase ssh-add #? ; #then execute rsync command "${SYNC[@]}" else #execute rsync command "${SYNC[@]}" fi else echo "Operation aborted!" fi
我能找到的唯一範例建議將程式碼放置在 .bashrc 或 .profile 中,這會強制我每次啟動 shell 時輸入密碼或創建儲存密碼的期望文件,這兩個我都不希望做。如何在啟動 rsync 腳本時只提示一次密碼片語,以便我可以切換主機並重新執行腳本,如我的範例所示。
首先您可以檢查是否
ssh-agent
正在執行,如果沒有則啟動它:if ! [ -n "$SSH_AUTH_SOCK" ] || ! { ssh-add -l &>/dev/null; rc=$?; [ "$rc" -eq 0 ] || [ "$rc" -eq 1 ];}; then echo "Starting agent..." eval "$(ssh-agent -s)" fi
ssh-add -l
如果沒有身份則以程式碼 1 退出,如果無法連接到 則以程式碼 2 退出ssh-agent
。然後為您需要的密鑰添加密碼。
ssh-add ~/path/to/keyfile
的想法
ssh-agent
是讓一個正在執行的服務儲存您的所有密鑰。因此,您只需要輸入一次密碼,如果您想從那裡登錄到第二台主機,您甚至可以將您的代理轉發到遠端主機。首先使用 驗證是否
ssh-agent
正在執行ssh-add -l
,這可能會顯示“代理沒有身份”。
ssh-add
其次,您通過說或向您的代理添加密鑰ssh-add path/to/key/file
。之後 rsync 就像任何其他使用 ssh 的命令一樣,將簡單地使用代理來獲取遠端連接所需的密鑰。