Linux expect 详解

Expect简介

  • Expect是Unix系统中用来进行自动化控制和测试的软件工具,由Don Libes制作,作为Tcl(Tool Command Language)脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。
  • Expect含有利用正则表达式进行模式匹配以及通用的编程功能,允许简单的脚本智能地管理如下工具:telnet,ftp和ssh(这些工具都缺少编程的功能),宏以及其它程序。Expect脚本的出现使得这些老的软件工具有了新的功能和更多的灵活性。

安装expect

首先检查系统是否自带了expect程序, 一般在 系统的/usr/bin目录下, 如果没有自带expect, 那么需要自行安装expect. 这里仅介绍ubuntu和redhat系列linux的安装方法。
ubuntu系列

apt-get install expect

redhat系列

yum install expect

一个简单的ssh登录远程服务器的例子

  • 创建一个ssh_auto_login.exp脚本文件
#!/usr/bin/expect
set timeout 30 
spawn ssh -l username 192.168.1.1 
expect "password:" 
send "ispass\r"
interact 

说明:

  • 第一行 #!/usr/bin/expect 与执行方式有关, 当我么以 ./ssh_auto_login.exp,我们必须通过第一行告诉操作系统,脚本需要通过/usr/bin/expect程序来运行,而且我们还要授予文件可执行权限。
    如果我们以下面这种方式执行ssh_auto_login.exp, 也可以不用写第一行, 而且不必授予其可执行权限。
    expect ssh_auto_login.exp
    
  • 第二行 set timeout 30 设置命令的命令的超时时间, 单位是秒。
  • 第三行 spawn ssh -l username 192.168.1.1,后面的ssh登录命令很好理解,这里主要解释前面为什么需要添加一个spawn, spawn是expect程序的一个内置命令,使用它将我们需要执行的各种shell命令包裹起来,这样就shell命令注入了和自动化脚本expect, send交互的能力。只有包裹后程序才有机会获取shell命令的输出,并根据输出做出反应。它是expect的灵魂所在。不清楚软件作者这里为什么要使用spawn这个单词,这里有些晦涩难懂,spawn作动词主要是产卵, 繁殖的意思,我始终不能把产卵和spawn在expect程序中的行为和作用联系起来。我只能发挥想象把spawn想象成一个大卵泡, 卵泡里面包裹的DNA物质就是我们正真执行的核心程序,脚本通过这个巨大的卵泡与核心程序进行交互。
  • 第四行expect "password:"
    这里的expect是expect的一个内部命令, 是不是有点晕,此expect非彼expect, 彼expect是指第一行中的#!/usr/bin/expect, 或者expect ssh_auto_login.exp 中的expect, 彼expect是一个shell命令, 而此expect是/usr/bin/expect内部的一个子命令。 有点像一个叫expect的妈妈怀了一个叫expect的小崽子。是不是更晕了, 如果更晕了,那就对了, 慢慢体会。 我真搞不懂英语中那么多表示期望期待的单词词组,作者为什么要卯着这一个词用,害苦了这帮后入行的程序员, 一代比一代脱发厉害:)。
    • 回归正题, 这个命令的意思是判断上次输出结果里是否包含“password:”的字符串
      如果有则立即返回否则就等待一段时间后返回这里等待时长就是前面设置的30秒。
    • 注意这里的用词是包含,也就是如果完整输出是"please in put your password:"也算中,河南话中,普通话也算满足期待的条件,哪个简洁? :)
    • 输出是千变万化的,比如不同的主机,ssh过去它的提示信息可能都不一样,难道我们的我们expect程序就要认怂嘛,这才第四行代码当然不能,expect 后面可以接收正则表达式, 这样无论提示符号是pwd, passwd, password, 正则表达式都能搞定它,正则就是如来佛的手掌心。
    • 这里的输出是指哪里的输出, 这里的输出是指控制台的输出不是文件输出,控制台有正常输出和错误输出,怎么算?留个思考题
  • 第五行 send "ispass\r"
    • 当expect接收到“password:”提示符,所以上面的expect实际是在等待“password:”提示符出现,使用等待多好,wait, 等待“password:”提示符出现后继续往后执行,紧接着地就是send命令, send将密码发送到控制台,这里是输入通道。
    • 写到这里想象善于思考的朋友,肯定会想到,如果前面的expect命令等待超时了,即没有出现输入密码提示,这里的send 会不会被执行?代码不长,大家可以自己动手测试一下。只有把这个搞清楚了, 第二行代码的作用才算彻底弄明白。
    • 这里再留个思考题,代码这样写密码是不是很容易泄露,有什么办法即使脚本被截获,密码不泄露?
  • 第六行 interact
    • 前面几行都是本地机器和远程机器自动的在交互,自动程序帮你把电脑开机了,服务器登录了,空调开启了,茶泡好了(假设程序能泡茶,可以想象一下),接下来控制权还是要交给人类, 这里的interact即使将控制权由机器控制转换为人机交互, 由人来接管。

参考文档

Expect—百科篇命令

expect(1) - Linux man page

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

推荐阅读更多精彩内容