為了實現基于key的驗證,需要將本機的公鑰傳到多個遠程主機,傳給額過程中要輸入yes和密碼,如果遠程主機很多,人工一個個的輸入密碼浪費時間,expect腳本可以實現代替人工完成交互式的指令。
[root@centos7 app]#cat ip.txt
zhang 172.18.21.106 123456
dufu 172.18.21.6 123456
[root@centos7 app]#cat ssh-copy-id.sh
#!/bin/bash
#
cat /app/ip.txt |while read file;do
username=`echo $file|cut -d ' ' -f1`
ip=`echo $file|awk '{print $2}'`
passwd=`echo $file|awk '{print $3}'`
expect << end
---將expect利用多行重定向傳入當前腳本
set timeout 100
----設置多長時間跳出expect,建議時間設置的長一點,如果沒有這一
行,默認的時間也很短,大概5秒,所以這一行要加上,并且把時
間設置的長一點,遠程主機比較多,可以設置的時間更長一點
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $username@$ip
expect {
"yes/no" { send "yes\n" ;exp_continue }
---當捕捉到yes/no信號時執行yes\n命令,因為前面捕捉的信號為多個,所以后面要加上exp_continue
"password" { send "$passwd\n" }
}
expect eof
end
done