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 循环即可