为了实现基于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