注:
1、目的:实现在每天2点将服务器上的数据库文件通过scp发送到另一台服务器,同时自动输入密码;
2、相关插件下载地址(expect + tcl 与本文配套):
https://download.csdn.net/download/weixin_42184538/85143246
一、expect的安装
expect是在tcl的基础上发展起来的,所以在安装expect之前务必要先安装tcl
1、安装 tcl
1、将下载的tcl安装包上传到服务器(tcl8.4.11为例)<下载链接在本文最上方>
2、按顺序执行下面的命令进行安装
[root@fqdn soft]tar -zxf tcl8.4.11-src.tar.gz
[root@fqdn soft]cd tcl8.4.11/unix
[root@fqdn soft]./configure --prefix=/usr/tcl --enable-shared
[root@fqdn soft]make
[root@fqdn soft]make install
[root@fqdn soft]cp tclUnixPort.h ../generic/
注意:
1、安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。
2、暂时不要删除tcl源代码,因为expect的安装过程还需要用。
2、安装 expect(需tcl的库)
将下载的expect安装包上传到服务器(expect-5.43.0为例)<下载链接在本文最上方>
[root@fqdn soft]tar -zxf expect-5.43.0.tar.gz
[root@fqdn soft]cd expect-5.43
[root@fqdn soft]./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic
[root@fqdn soft]make
[root@fqdn soft]make install
[root@fqdn soft]ln -s /usr/expect/bin/expect /usr/bin/expect
3、验证 expect
[root@fqdn soft]expect
若提示命令找不到请尝试下面的命令,确认安装正常后,参考本文最后的错误处理调整一下即可!
[root@fqdn soft]/usr/expect/bin/expect
显示如下图即为安装正常(出现 expect1.1)
二、expect的使用
示例:例如定时将数据库备份文件发送到另一台服务器
1、编写脚本
脚本一:用于传参数到第二个脚本<假定放置路径为/home/soft>
比如:sendMysql.sh,脚本内容如下
#!/bin/bash
# 设置文件名
date=$(date +"%d-%b-%Y")
# 传文件名到第二个脚本
/home/soft/send.sh $date
脚本二:用于发送文件到其他服务器<假定放置路径为/home/soft>
比如:send.sh,脚本内容如下,*** 为你的密码,\r 为模拟回车,务必保留!
#!/usr/bin/expect
#获取文件名
set file_name [lindex $argv 0]
# 传输文件
spawn scp /home/mysqlBak/db_name-$file_name.sql root@192.168.*.*:/home/fileBak
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password" {set timeout 500;send "***\r";}
}
expect eof
2、添加定时任务
[root@fqdn soft]crontab -e
添上命令保存即可
# 每两天的2点执行一次
0 2 * * * /bin/sh /home/sendMysql.sh
三、Expect命令详解
Expect脚本中常用的命令包括spawn, expect, send, interact等。
spawn
该命令用于启动一个子进程,执行后续命令
expect
该命令从进程接受字符串,如果接受的字符串和期待的字符串不匹配,则一直阻塞,直到匹配上或者等待超时才继续往下执行
send
向进程发送字符串,与手动输入内容等效,通常字符串需要以’\r’结尾。
interact
该命令将控制权交给控制台,之后就可以进行人工操作了。通常用于使用脚本进行自动化登录之后再手动执行某些命令。如果脚本中没有这一条语句,脚本执行完将自动退出。
set timeout 30
设置超时时间timeout为30s,expect命令阻塞超时时会自动往下继续执行。将timeout配置为-1时表示expect一直阻塞直到与期待的字符串匹配上才继续往下执行。超时时间timeout默认为10s。
[lindex $argv n]
可以在脚本中使用该命令获取在脚本执行时传入的第n个参数。这里argv为传入的参数,另外argv为传入的参数,另外argc表示传入参数的个数,$argv0表示脚本名字。
另外我们也可以使用[lrange $argv sn en]命令获取第sn到第en个参数。
四、错误解决方案
欢迎小伙伴们留言遇到的问题,我会及时补充上
1、未找到命令
解决方案:(1)检查是否将 #!/usr/bin/expect 放置在脚本的第一行;(2)重新建立expect的软连接
ln -s /usr/expect/bin/expect /usr/bin/expect