Ssh

自動SSH提示輸入

  • December 21, 2021

我正在嘗試將一堆 RSA 密鑰複製到特定使用者的多個伺服器。每當我發出ssh-copy-id命令時,它都會要求我輸入“是”來確認,然後要求我輸入密碼。我想避免磨損我的手臂和手指,所以,我決定為這個任務創建一個腳本,如下所示:

#!/bin/bash
runuser -u $RMTUSER -- ssh-copy-id root@172.24.168.47
runuser -u $RMTUSER -- ssh-copy-id root@172.24.168.48
(...)
runuser -u $RMTUSER -- ssh-copy-id root@172.24.168.212
runuser -u $RMTUSER -- ssh-copy-id root@172.24.168.213

我似乎找不到自動化該任務的好方法。似乎沒有任何效果。如何自動輸入“是”和密碼?


我意識到我最初的問題很乏味。對此我很抱歉……不過,它仍然在上面。

我已經將腳本改進為類似於 Marcus 提議的內容。我被困在“for”循環中,想知道如何為不同的伺服器陣列傳遞該密碼。

我的主機集都是靜態的,還有更多。

#!/bin/bash

LOCUSER="$1"    # USER FOR REMOTE ACCESS
RMTUSER="$2"    # REMOTE USER
PASSWD="$3"     # SITE PASSWORD
SITE="$4"       # SERV SITE


function uras() {
       for IP in "$@"; do
               runuser -u "${LOCUSER}" -- sshpass "-p${PASSWD}" ssh-copy-id "${RMTUSER}@${IP}"
               [ "$?" -eq "0" ] && echo "OK - $IP" || echo "FAIL! - $IP"
       done
       }


case $SITE in
       "sa")
               ARRAY_A=( $(cat ./serv_a.txt) )
               uras "${ARRAY_A[@]}"
               ;;
       "sb")
               ARRAY_B=( $(cat ./serv_b.txt) )
               uras "${ARRAY_B[@]}"
               ;;
       "sc")
               ARRAY_C=( $(cat ./serv_c.txt) )
               uras "${ARRAY_C[@]}"
               ;;
       *)
               echo "INVALID SITE"
               ;;
esac

儘管如此,每個主機的腳本都失敗了。

# ./auto_ssh_copy.sh [user] root [pass] [site]
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.48
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.49
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.50
(...)

我也嘗試使用“-f”,但結果是一樣的。

我同意使用像 Ansible 這樣強大的工具可能是完成這項工作的更好工具,但不幸的是,它目前在我的工作集中不可用。這是我到目前為止想出的。


最後,我設法複製了所有密鑰。上面的腳本缺少 option -o StrictHostKeyChecking=no,因此sshpass返回退出程式碼 6。生成的命令是這樣的:

runuser -u ${LOCUSER} -- sshpass -v -p${PASSWD} ssh-copy-id -o StrictHostKeyChecking=no ${RMTUSER}@${IP}

Marcus awnser 幫了大忙。謝謝大家。

您可以使用to 選項禁用yes檢查。-f``ssh-copy-id

密碼可能應該是該腳本的一部分,假設該腳本最終位於其他人可能讀取的某個地方。相反,我建議編寫這樣的腳本:

#!/bin/sh
# Usage: myscript user password

RMTUSER=$1
PASSWORD=$2
# just an example, but to highlight you can use brace expansions.
hosts=("172.24.168.47" "172.24.168.48" 172.24.168.{200..213})

for host in ${hosts[@]}; do
 runuser -u "${RMTUSER}" -- sshpass "-p${PASSWORD}" ssh-copy-id -f "root@${host}"
done

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