==执行scp命令(注意开头必须要有spawn, 否则无法实现交互)
expect
需和spawn 配合使用 ,表示匹配spawn
指定的脚本或命令的输出结果
,如果与expect
后面的字符串匹配,就执行下面的send
命令,表示对结果响应反馈
有时命令的输出提示信息有可能会变化,所以可以在expect中使用模糊匹配,比如*
。
注意:匹配的动作也可以放在下一行,这样就不需要使用{}(大括号)了
send
在expect命令匹配指定的字符串后,发送指定的字符串给系统,这些命令可以支持一些特殊转义符号,例如:\r表示回车、\n表示换行、\t表示制表符等
exp_continue
从命令的拼写就可以看出命令的作用,即让Expect程序继续匹配的意思,如果需要一次匹配多个字符串,那么不同的匹配之间就要加上exp_continue,否则expect将不会自动输入指定的字符串。最后一个的结尾就不需要加上exp_continue了,因为前面都已完成了,它是最后一个啦
exit
功能类似于Shell中的exit,即直接退出脚本,还可以利用这个命令对脚本做一些关闭前提示等工作
send_user
打印Expect脚本信息,类似Shell里的echo. 例如打印变量信息,验证数据传入是否正常
在掌握expect 基本使用方式后,我们写一个批量查看机器负载信息的小脚本,加强记忆
#! /usr/bin/expect
set time 30
set ip [lindex $argv 0]
spawn ssh root@$ip uptime
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect eof
实战结果:
小试牛刀
在学习完以上两个方法,我们试着写一个脚本,结合上述两种方式,批量查看各机器目录挂载情况,并列举出来,参考脚本如下:
#!/bin/bash
ip="192.168.31.89"
username="root"
password="123456"
cmd=" df -PTh|grep ^/dev"
# 指定执行引擎
expect <<EOF
set time 30
spawn ssh $username@$ip $cmd
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect eof
EOF
??以上两种方式就是日常在Linux Shell 脚本常用来做自动化部署,解决脚本执行过程参数交互问题,尤其expect 配合一些shell脚本执行,十分便捷。除了以上使用方式,在企业生产中,我们还会用到ansible 脚本,ansible是新出现的自动化运维工具,基于Python开发,通过调用其模块,实现批量系统配置、批量程序部署、批量运行命令等功能,有兴趣的小伙伴可以试试学习下。