Bash

如何在腳本執行期間呼叫 ssh 密鑰密碼提示?

  • January 21, 2015

在我的 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 的命令一樣,將簡單地使用代理來獲取遠端連接所需的密鑰。

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