有些命令却需要用户手动去就交互如passwd、scp
对自动部署免去用户交互很痛苦,expect能很好的解决这类问题。
expect的核心是spawn expect send set
spawn 调用要执行的命令
expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
send 发送需要交互的值,替代了用户手动输入内容
set 设置变量值
interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。
设置expect永不超时
set timeout -1
设置expect 300秒超时,如果超过300没有expect内容出现,则退出
set timeout 300
使用实例:
批量发送ssh秘钥
allip=`nmap -v -sP 192.168.238.0/24|grep 192.168|grep -v "down"|grep -v 192.168.238.2 |cut -d " " -f5 2>/dev/null` 通过nmap扫描ip,获取ip
[ ! -x /usr/bin/expect ] && yum install expect -y 判断是否安装了expect因为默认是没有安装的
下面就是一个循环了
for i in $allip;do
if [[ $i =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]];then
/usr/bin/expect <<EOF
set timeout 10
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]$i
expect {
"password" {send "redhat\n"}
}
expect eof
EOF
这样就可以自动把自己主机上的秘钥发送到对应的主机上面