题外话
如果各位客官有需要开发一些小小需求,可以私我哦,承接小需求开发,或问题定位(仅限java),价格私聊哈
一、安装expect
1. 确认expect是否安装
expect -v
如果系统中已经安装了 expect,就看到 expect 的版本信息。如果没有安装,则需安装 expect 工具
2. 安装expect
yum install -y expect
二、expect脚本
1. [#!/usr/bin/expect]
这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
注意:这一行需要在脚本的第一行。
2. [set timeout 30]
“set 自定义变量名”:设置超时时间的,现在你只要记住他的计时单位是:秒 。timeout -1 为永不超时
3. [spawn ssh -l username 192.168.1.1]
spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。
它主要的功能是给ssh运行进程加个壳,用来传递交互指令。可以理解为启动一个新进程
4. [expect “password:”]
从进程接收字符串,这里的expect是expect的一个内部命令,expect的shell命令和内部命令是一样的,但不是一个功能。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒;
5. [send “ispass\r”]
send接收一个字符串参数,并将该参数发送到进程。这里就是执行交互动作,与手工输入密码的动作等效。 命令字符串结尾别忘记加上“\r”,表示“回车键”。
6. [interact]
允许用户交互;执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
7.$argv 参数数组
expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个…参数
8.执行脚本
- 直接./执行脚本
eg:./shell.exp
- expect 执行脚本
eg:expect shell.exp
三、实战
1. 编写expect脚本
实现一个从其它服务器拷贝文件的脚本
vim scp.exp
脚本内容如下:
#!/usr/bin/expect
# 在ip2上拷贝ip1的jar包到ip2机器上的指定路径
spawn scp username@ip1:/opt/data/MyProject1/lib/project.jar /opt/data/MyProject2/project/lib
# 判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回
expect "password:"
#send接收一个字符串参数,并将该参数发送到进程。这里就是执行交互动作,与手工输入密码的动作等效。命令字符串结尾加上“\r”,表示“回车键”
send "MyIP1Password\r"
#执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上
interact
修改脚本权限
chmod +x scp.exp
执行脚本
# 1.expect执行
expect scp.exp
# 2. ./执行
./scp.exp
2.shell脚本里嵌入expect脚本
实现在shell脚本里嵌入expect脚本实现免交互拷贝jar包,脚本内容如下:
#!/bin/bash
/usr/bin/expect << EOF
spawn scp username@ip2:/opt/data/project/lib/project.jar /opt/data/project/lib
expect "password:"
send "your_password\r"
expect eof
EOF
四、实战错误总结
1. 执行脚本异常
执行脚本报错
/usr/bin/expect: 坏的解释器: 没有那个文件或目录
可能原因:未安装expect
,参照第一章节安装expect
2. 执行脚本报未找到命令
执行脚本报错如下
scp.exp:行2: spawn: 未找到命令 couldn't read file "password:": no such file or directory scp.exp:行6: send: 未找到命令 scp.exp:行8: interact: 未找到命令
可能原因:使用sh错误执行脚本,应使用expect执行脚本