expect与sshpass拥有相同的功能,即在运行ssh,scp等命令时可直接在文本中输入密码,免交互,详情见之前文档sshpass,但expect比sshpass更好的是,expect可以根据搜索的内容填入你想填的内容,不仅仅局限于输入密码,还可以输入yes/no,输入命令等等,可以说expect的功能性是大于sshpass的
下载安装
在线的话可直接 yum install -y expect
离线安装的话需要先下载离线包再安装
# 离线下载安装包
yumdownloader expect
# 如果没有tcl,还需要安装tcl,它和expect是绑定依赖的
yumdownloader tcl
之后再把下载过来的安装包拷贝到目标服务器,运行rpm -ivh xxxxxx.rpm 安装即可
最后输入expect,如果正确返回则代表安装成功
组件介绍
- spawn: 交互程序开始后面跟命令或者指定程序,开头必有的
- expect: 获取匹配信息匹配成功则执行expect后面的程序动作,类似于if
- send: 用于发送指定的字符串信息,类似于if下的输入
- exp_continue 在expect中多次匹配就需要用到,类似于else
- send_user 用来打印输出 相当于shell中的echo
- exit 退出expect脚本
- expect eof 执行结束,退出,一定要有这个,不然可能会脚本还未结束就退出了
- set 定义变量
- puts 输出变量
- set timeout 设置超时时间
运行原理
第一步使用spawn开启一个会话,然后使用except搜索,一般我们会选择,匹配的用send来进行输入,也就是expect和send是一对同生共死的来完成执行交互式操作
名词解析
- spawn:是expect语法里的第一步,不可或缺的第一步,在里面写你想要实现的命令
spawn ssh root@192.168.1.xxx "df -Th"
- expect-send:这两个是一起出现的,我就放在一起说了,expect相当于搜索判断,搜索到的模块由send来发送输入信息
# 这两个是等价的,也就是换行时不用操作,在同一行时需加上大括号
# \n是换行,\r是enter, *是通配
expect "*password:"
send "xxxxxxx\n"
expext "*password:" {send "xxxxxxx\n"}
# 多重搜索相当于switch
expext {
"*password:" {send "xxxxxxx\r";exp_continue}
"*yes/no" {send "yes\r"}
}
实例演示
expect << EOF
set timeout 10
spawn ssh root@192.168.1.xx "df -Th"
expect {
"*password:" { send "xxxxxxxx\r";exp_continue}
"yes/no" {send "yes\r"}
}
expect "*]#"
send "ls\r"
expect "*]#"
send "exit\r"
expect eof
EOF
tips:如果是多台服务器,可以把服务器写进列表或者配置文件里,然后写一个for 循环即可