expect命令

1.什么是expect

    expect是基于TCL的相对简单的一个免费的脚本编程工具语言,用来实现自动和交互式任务程序语言进行通信,无需人工干预,其作者定义为:expect is a software suite for automating interactive tools

2.expect程序的工作流程

    except的工作流程可以理解为: spawn启动进程 --> expect期待关键字 --> send向进程发送字符 --> 退出结束

3.安装except

yum install expect -y

4.一个小实例

#!/usr/bin/expect
spawn ssh -p22 root@192.168.1.25 /usr/sbin/ifconfig -a
set timeout 60
expect "*password:" {send "root1234\n"}
expect eof
exit

5.expect语法

    expect命令的语法:

命令 [选项] 参数

5.1 spwan

    spwan命令是expect的初始命令,它启动一个进程,之后所有expect操作都在这个进程中进行,其使用方法如下:

spwan ssh root@192.168.1.26

    在spwan命令后面,直接加上要启动的进程、命令等信息,除此之外,还支持其他选项:

-open      启动文件进程,具体说明请自行查阅
-ignore    忽略某些信号,具体说明请自行查阅

5.2 expect

    使用方法:

expect 表达式 动作 表达式 动作 ... ...

    expect命令用于等候一个相匹配内容的输出,一旦匹配则执行expect后面的动作命令,这个命令接收几个特有参数,用的最多的就是-re,表示使用正则表达式进行匹配,如下:

spwan ssh root@192.168.1.26
expect -re ".*password" {send "root1234\r"}

    expect是依附与spwan命令的,当执行ssh命令后,expect就会匹配命令执行后的输出,然后执行expect后面包含在{}中的send或exp_send动作,匹配及动作可以放在下一行,就可以省略{},如下:

spwan ssh root@192.168.1.26
expect -re ".*password" 
send "root1234\r"

5.3 exp_send和send

    在上面的介绍中,我们看到了exp_send命令的使用,exp_send是expect中的动作,send和其作用一样。exp_send命令可以发送一些特殊符号:

\r      回车
\n      换行
\t      制表符

    send命令还有几个可选的参数:

-i      指定spwan_id, 这个参数用来向不同的spwan_id的进程发送命令,是进行多进程控制的关键参数。
-s      s代表slowly,也就是控制发送的速度,这个参数使用的时候要与expect中的变量send_slow向关联

5.4 exp_continue

    这个命令一般用在动作中,它被使用的条件比较苛刻,例子:

#!/usr/bin/expect
spwan ssh -p22 root@192.168.1.26 /usr/sbin/ifconfig eth0
set timeout 60
expect {
    -timeout 1
    "yes/no" { exp_send "yes\r"; exp_continue }
    "*password:" { exp_send "root1234\r" }
    timeout { puts "expect was timeout"; return }
}
expect eof
exit

    个人理解:spwan后面的命令的输出,从第一行开始进行expect遍历匹配,若匹配则执行动作,不匹配则进行下条匹配,而exp_continue的作用是,若不匹配则跳过此行输出,并进行第二行输出进行expect的匹配

5.5 send_user

    send_user用于把后面的参数输出到标准输出中去,默认的send、exp_send都是将参数输出到程序中去,用法:

send_user "please input password:"

    这样就可以在标准输出中打印please input password:字符了。

#!/usr/bin/expect
if { $argc != 3 } {
    send_user "usage: expect scp-expect.exp file host dir\n"
    exit
}

5.6 exit

    exit命令功能很简单,就是直接退出脚本,但可以利用这个命令做一些扫尾工作,如:

exit -onexit {
    exec rm $tmpfile
    send_user "Good Bye\n"
}

6. expect变量

    expect中有很多有用的变量,他们的使用方法与TCL中的变量相同,如:

set   变量名 变量值   # 设置变量的方法
puts  $变量名         # 读取变量的方法

# define var
set file [lindex $argv 0] # 取命令行参数的
set host [lindex $argv 1]
set dir  [lindex $argv 2]
set password "root1234"

7. expcct关键字

    expect中的关键字用于匹配过程,代表某些特殊含义或状态,一般用于expect命令中而不能在外面使用,也可以理解为事件,如:

expect eof {}

7.1 eof

    eof(end-of-file)关键字用于匹配结束符,比如文件、ftp传输停止等,在这个关键字后跟上动作来做进一步的控制,特别是ftp交互操作方面,他的作用很大,如:

spawn ftp root@192.168.1.26
expect {
    "password:" {exp_send "root1234"}
    eof { ftp connect close }
}
interact { }

    interact也是关键字,可以是当前停留在服务端,交互模式使用

7.2 timeout

    timeout是expect中的一个重要变量,它是一个全局性的时间控制开关,你可以通过为这个变量赋值来规定整个expect操作的时间,注意这个变量是服务与expect全局的。例子:

set timeout 60
spawn ssh root@192.168.1.26
expect "*password:" { send "root1234\n" }
expect timeout {puts "timeout"; return }

    先将超时间设置为60秒,当程序阻塞到60秒,就会激活timeout动作。

    另一种设置timeout的方法,如下:

spwan ssh root@192.168.1.26
expect {
    -timeout 60
    -re "password:" {exp_send "root1234\r"}
    -re "TopsecOS#" { }
    timeout { puts "timeout"; return }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容