使用expect脚本实现SSH登录管理

expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect的作者Don Libes在1990年开始编写expect时对expect做有如下定义:expect是一个用来实现自动交互功能的软件套件(expect is a software suite for automating interactive tools)。使用它,系统管理员可以创建脚本来对命令或程序进行输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现简单的BBS聊天机器人。

expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。

好了,以上内容全部来自于百度百科,说一千道一万,expect最常用的还是作为Linux脚本管理服务器,处理一些批量任务。当然,最最常用的还是SSH登录远程服务器执行操作命令,网上也到处都是类似的脚本,好记性总不如烂笔头,我也记录一下自己的所接触的一些应用实例及学习体悟吧。

设想一下这样的场景,所有的服务器都在内网,公网访问管理服务器都要通过OpenVPN登录到跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址。而服务器的Root用户是全部禁止远程登录的,跳板机与服务器间做了非Root用户的SSH-Key信任关系。但是实际生产环境中,一些操作必须要sudo才能完成,单台服务器,直接登录然后sudo就行了,但是很多台怎么办呢?这时候expect就派上用场了。

废话这么多,还是直接上代码分析直观些。当然,这所有一切的前提都是要先安装expect:sudo yum install expect -y

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/expect

set timeout 3 #设置超时时间,单位是秒
spawn ssh [email protected]192.168.10.110 #发送SSH请求,spawn是expect的一个内建命令,用来传递交互指令,只有安装了expect之后,才会有这个命令
expect #返回信息匹配,expect也是expect的一个内建命令,判断上一个指令输入之后的得到输出结果是否包含""双引号里的字符串
{
"yes/no" { send "yes\r"; exp_continue} #如果是第一次登录,会出现"yes/no"的字符串,就发送(send)指令"yes\r",然后继续(exp_continue)
"192.168.10.120" { send "sudo touch /etc/file\r" } #承接上个指令,出现登录的IP,发送创建文件指令
}
expect "password:" #出现密码提示
send "test\r" #发送密码
expect eof #在远程服务器上执行完命令,然后退出远程服务器
exit

以上就是远程登录单台服务器执行指令的脚本,若是要在N台服务器上批量执行相同的命令,就用万能句式for i in $IP,把上面的192.168.10.110换成$IP就行了当然用户名密码得一样。注意:末尾\r一定不能漏!

如果是要在执行完指令后保持交互状态,停留在远程终端上,就把最后两行代码换成interact

很显然,expect还有很多的使用场景,也就不一一列举,大致的使用方法也就上面写的那么多。