一、expect介绍

  Expect是Unix系统中用来进行自动化控制和测试的软件工具,由DonLibes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。
  简单地说,expect是一个工具,可以根据用户设定的规则和系统进程进行自动化交互,例如远程登陆的密码输入、自动化的执行远程命令。

二、expect例子

  下面的脚本完成远程服务器的登录操作,并在远程服务器上执行一些简单的命令,在整个交互中不需要人工进行干预。

#!/usr/bin/expectif {$argc < } {
  puts stdout "$argv0 err params\n"
  exit
} proc do_console_login {login pass} {
puts $login;
puts $pass;
} puts [llength $argv] set timeout
set user [lindex $argv ]
set password [lindex $argv ]
do_console_login $user $password spawn ls -l expect "login_52.exp" expect eof spawn ssh $user@10.12.18.37# expect {
    "yes/no" {send "yes\n"
    expect "assword: " {send "$password\n"}
    }
    "*assword:" {send "$password\n"}
}
expect "~>"
send "cd /share/arlenhou/; la \n"
expect "arlenhou>" interact

三、expect语法介绍

1. 命令行参数

$argc,$argv ,$argv  ... $argv n  

argc表示命令行参数个数,后面分别表示各个参数项,0表示第一个参数,1表示第二个参数,以此类推,可以通过lindex获取对应参数值(lindex $argv 0)。

if {$argc < } {
puts stdout "$argv0 err params\n"
exit
}

2. 输入输出

puts stderr "Usage: $argv0 login passwaord.n "

puts “hello world”

puts stdout ""

3. 嵌套命令

set user [lindex $argv ]
set password [lindex $argv ]

把命令行第一个参数赋给user,第二个参数赋给password。

4. 命令调用

spawn ssh $user@10.12.18.37#

spawn启动一个进程,进程执行ssh命令,程序后面可以通过expect/send和新起的进程进行交互。

5. 函数定义和调用

proc do_console_login {login pass} { 

}

do_console_login $user $password

6. 变量赋值

set user “arlen ”

set int0   

7. 循环

while ($done) { 

}

8. 条件分支Switch

switch -- $var { 

 {

  } 

  { 

  } 

   { 

  } 

 }

三、常用指令

1. [#!/usr/bin/expect]

  这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 
  注意:这一行需要在脚本的第一行。

2. [set timeout 30]

  设置超时时间的,单位是:秒

3. [spawn ssh $user@10.12.18.37#36000]

  spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。它主要的功能是给ssh运行进程加个壳,用来传递交互指令。

4. [expect "assword: "]

  这里的expect也是expect的一个内部命令,expect的shell命令和内部命令是一样的,但不是一个功能。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒。

5. [send "$password\n"]

  这里就是执行交互动作,与手工输入密码的动作等效。

6. [interact]

  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

四、总结

  expect工具在日常的运维中非常有用,可以用在多机器服务重启、远程copy、多机器日志查看、ftp文件操作、telnet等多种场景。shell中有些操作会受限于密码输入的人工操作,expect工具可以代替人工来完成一些交互性工作。

linux下expect使用教程的更多相关文章

  1. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  2. 转:xdebug在linux下的安装教程

    原文:xdebug在linux下的安装教程 [注意,本人是PHP7.1.7 Nginx ,第7步没有做,但是xdebug.so就已经在PHP的扩展文件夹里面了.目录是phpinfo的extension ...

  3. Linux下aMule安装教程

    Linux下载神器aMule安装教程 aMule可以说是Linux下的电驴,你们说eMule是不是就是aMule的Windows版呢?也是开源的. Fedora安装aMule很简单,两条命令就搞定. ...

  4. 用了一天的时间,linux下expect实现ssh自动登录服务器记,鄙视下网上各种抄来抄去残段子

    因为要对客户方的快30个项目进行特别有顺序的重启,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的可以.没有一段是可以正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自动登录的脚 ...

  5. linux下expect环境安装以及简单脚本测试

    expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...

  6. 用了一天的时间,linux下expect实现ssh自己主动登录server记,歧视下网上各种抄来抄去残段子

    由于要对客户方的快30个项目进行特别有顺序的重新启动,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的能够. 没有一段是能够正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自己主 ...

  7. linux下 安装mysql教程

    安装环境:系统是 centos6.5 1.下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:我这里选择的5.6. ...

  8. Linux下Mysql安装教程详解

    Linux下软件安装一般有三种方式:RPM包方式(通过Redhat 第三方包管理系统).二进制包和源码包.本篇主要介绍二进制包安装mysql数据库的方式. 如何获取二进制源码包 当然是到mysql官网 ...

  9. Linux下CMake简明教程

    转载地址:https://blog.csdn.net/whahu1989/article/details/82078563 CMake是开源.跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本 ...

随机推荐

  1. 界面上传文件js包【AjaxUpload.js】

    function uploadFile() { new AjaxUpload($("#importFile"), { action: url, type: "POST&q ...

  2. (九)ASP.NET自定义用户控件(2)

    http://www.cnblogs.com/SkySoot/archive/2012/09/04/2670678.html 用户控件 在 .NET 里,可以通过两种方式把自己的控件插入到 Web 窗 ...

  3. (二)javascript中int和string转换

    在javascript里怎么样才能把int型转换成string型 (1)var x=100 a = x.toString() (2)var x=100; a = x +""; // ...

  4. Android HTTPS(3) IOException: Hostname 解决方案

    Common Problems with Hostname Verification As mentioned at the beginning of this article, there are ...

  5. c# -- 读取文件夹中的所有文件(备忘)

    读取选取的文件夾下的所有.txt文件 private void button1_Click(object sender, EventArgs e){ if (folderBrowserDialog1. ...

  6. Head first javascript

    基础 <script type="text/javascript"> function validateNumber(value) { // Validate the ...

  7. list::splice()函数详解

    http://blog.csdn.net/bichenggui/article/details/4674900 list::splice实现list拼接的功能.将源list的内容部分或全部元素删除,拼 ...

  8. malloc/free和new/delete的异同

    一.基本概念 malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返 ...

  9. [ionic开源项目教程] - 第2讲 新建项目,配置app.js和controllers.js搭建基础视图

    新建项目 由项目功能架构图选择合适的页面架构,这里选用Tab,ionic新建项目,默认的模板就是tab. $ ionic start TongeNews Creating Ionic app in f ...

  10. SharePoint的实体生成

    生成Linq实体 使用SPMetal工具生成Linq to SharePoint实体 工具安装目录: C:\Program Files\Common Files\Microsoft Shared\We ...