目录
expect一 expect介绍二 expect实例三 为expect脚本传参
expect
一 expect介绍
是一个免费的编程工具,安防的边界越来越模糊,用来实现自动的交互式任务,安防产业已经进入一个全新的泛安防时代。据IDC Global DataSphere预测,而无需人为干预。说白了,2020全球视频监控产生的数据约18.1PB (1PB=1024TB),就是一套用来实现自动交互功能的软件。需要安装
yuminstall-yexpect
expect基础
在使用时,占同期物联网总数据量83.1%,基本上都是和以下四个命令打交道:
命令用来启动新的进程,构成了物联网数据的主体。安防领域视频摄像头的分辨率越来越高,后的和命令都是和使用启动的新进程进行交互。
通常用来等待一个进程的反馈,署场景也越发广泛,我们根据进程的反馈,从而导致数据规模高速增长,再使用命令发送对应的交互命令。
命令接收一个字符串参数,这给传输带宽及存储带来了很的压力,并将该参数发送到进程。
命令用的其实不是很多,也提出了更高的要求。然而在实际应用中,一般情况下使用、和和命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用命令的,出于各种人力和技术条件的限制,命令主要用于退出自动化,进入人工交互。比如我们使用、和命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用命令就可以很好的完成这个任务。
总结expect自动应答的基本步骤
第一步:运行一个程序或命令=> spawn命令信息
第二步:识别产生信息关键字=> expect捕获关键字 {send 应答信息}
第三步:根据识别关键做处理=> send 应答信息
二 expect实例
自动应答脚本
解释
#1、#!/usr/bin/expect -f:使用expect来解释该脚本
#2、spwan:
spawn是进入expect环境后才可以执行的expect内命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。它主要的功能是给ssh运行进程加个壳,用来传递交互指令;
#3、expect:
expect"*assword":这里的expect也是expect的一个内命令,这个命令的意思是判断上次输出结果里是否包含“password”的字符串,如果有则立即返回;否则就等待一段时间后返回,这里等待时长就是前面设置的30秒;
#4、send:
send"1\n":当匹配到对应的输出结果时,就发送密码到打开的ssh进程,执行交互动作;
首次登陆之后,再次登陆,就不会出现yes/no的提示了,所以上述脚本再次运行会出现spawn 命令出现交互式提问的expect 匹配不上的情况,此时脚本会阻塞在原地,我们可以set timeout 3设置超时时间,单位为秒,默认情况下是10秒,以保障脚本超时则结束,
设置超时时间的目的仅仅只是为了让脚本不要一直卡在原地,要真正解决上述问题,需要改写成下述形式
练
[root@aliyun~]# cat 1.sh
#!/usr/bin/expect -f
spawnsshegon@127.0.0.1
settimeout-1 # 设置为-1代表永不超时,如果expect没有捕捉到就一直停在原地
expect{
"yes/no"{send"yes\n"}
}
expect{
"password"{send"1\n"}
}
expect"*egon*"
send"ls\n"
expect"\$"
send"pwd\n"
expect"\$"
send"exit\n" # 注意一定要输入exit结束信号
expecteof # 最后关闭匹配
[root@aliyun~]#
interact交互
:执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
[root@egon~]# cat test.sh
#!/usr/bin/expect -f
spawnsshroot@192.168.12.20
expect{
"yes/no"{send"yes\r";exp_continue}
"*assword"{send"1\n"}
}
interact
[root@egon~]#
[root@egon~]# ./test.sh
spawnsshroot@192.168.12.20
root@192.168.12.20's password:
Lastlogin:WedAug2621:28:42020fromegon
+--------------------------------------------+
| |
| 你当前登录的是支付业务后台数据库服务 |
| 请不要删库 |
| |
+--------------------------------------------+
[root@egon~]# pwd
/root
[root@egon~]# echo "hello"
hello
[root@egon~]# exit
登出
Connectionto192.168.12.20closed.
[root@egon~]#
三 为expect脚本传参
shell脚本中的变量无法直接在expect中使用的,若expect需要使用变量
一方面可以自己定义
#!/usr/bin/expect -f
settimeout-1
setuser"root"
setip"192.168.12.20"
setcmd"hostname"
setpass"1"
spawnssh$user@$ip$cmd
expect{
"yes/no"{send"yes\r";exp_continue}
"*assword"{send"$pass\n"}
}
expecteof
另外一方面可以通过下述方式引入shell变量,注意此时解释器换成#!/bin/bash
#!/bin/bash
user="root"
ip="192.168.12.20"
cmd="hostname"
pass="1"
expect
spawnssh$user@$ip$cmd
expect{
"yes/no"{send"yes\r";exp_continue}
"*assword"{send"$pass\n"}
}
expecteof
EOF
此外,expect脚本还可以从命令行获取参数
在expect中,表示参数个数,而参数值存放在中,比如取第一个参数就是,以此类推。
[root@egon~]# cat test.sh
#!/usr/bin/expect -f
if{$argc!=4} {
puts"Usage:./script.sh "
exit1
}
setip[lindex$argv]
setuser[lindex$argv1]
setpass[lindex$argv2]
setcmd[lindex$argv3]
settimeout-1
spawnssh$user@$ip$cmd
expect{
"yes/no"{send"yes\r";exp_continue}
"*assword"{send"$pass\n"}
}
expecteof
[root@egon~]# ./test.sh
Usage:./script.sh
[root@egon~]# ./test.sh 192.168.12.20 root 1 hostname
spawnsshroot@192.168.12.20hostname
root@192.168.12.20's password:
egon
[root@egon~]#
能够在工作中熟练的使用Shell脚本就可以很程度的提高工作效率,如果再搭配上expect,那么很多工作都可以自动化进行,对工作的展开如虎添翼。如果你会Python的话,你的视野将会更加开阔,那个时候你又会“嫌弃”expect了。
—END—
标签: