久久科技网

频处理计算【Shell编程】13 expect智能安

久久科技网 1

目录

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—

笔记本第二个风扇怎么转

生日快乐平板电脑怎么下载

怎么关闭计时器cpu

微信起名字用什么字好男生

哑舍里哪件古董是真的

李春廷字画能卖多少钱

周六福翡翠怎么鉴定真伪

快手小店账户资金设置多少

西藏如何进行seo优化

标签: