Ssh
自動SSH提示輸入
我正在嘗試將一堆 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