zoukankan      html  css  js  c++  java
  • linux下expect使用教程

    一、expect介绍

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

    二、expect例子

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

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

    三、expect语法介绍

    1. 命令行参数

    $argc,$argv 0,$argv 1 ... $argv n  

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

    if {$argc < 2} {
    puts stdout "$argv0 err params
    "
    exit 1
    }

    2. 输入输出

    puts stderr "Usage: $argv0 login passwaord.n "
    
    puts “hello world”
    
    puts stdout "1234"

    3. 嵌套命令

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

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

    4. 命令调用

    spawn ssh $user@10.12.18.37#36000

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

    5. 函数定义和调用

    proc do_console_login {login pass} { 
    
    }
    
    do_console_login $user $password

    6. 变量赋值

    set user “arlen ”
    
    set int0 1  

    7. 循环

    while ($done) { 
    
    }

    8. 条件分支Switch

    switch -- $var { 
    
    0 {
    
      } 
    
     1 { 
    
      } 
    
      2 { 
    
      } 
    
     }

    三、常用指令

    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 "] 

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

    6. [interact] 

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

    四、总结

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

  • 相关阅读:
    友链
    OI日常
    P4451 [国家集训队]整数的lqp拆分 生成函数
    AT4831 [ABC155F] Perils in Parallel 生成树
    P4438 [HNOI/AHOI2018]道路 树DP
    CF383E Vowels 子集DP 容斥
    P5488 差分与前缀和 生成函数+多项式EXP
    CF115E Linear Kingdom Races 线段树优化DP
    CF49E Common ancestor 区间DP
    P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II 莫队二次离线
  • 原文地址:https://www.cnblogs.com/arlenhou/p/learn_expect.html
Copyright © 2011-2022 走看看