码迷,mamicode.com
首页 > 系统相关 > 详细

Linux之expect命令免交互实现

时间:2018-08-13 18:02:57      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:inux   启动   执行命令   回车   index   原理   设置   发送信息   cli   

expect命令,是基于tcl的一门语言,其内在原理和早期的chat一样;

是用于实现用户和程序之间的交互自动化进行的工具。

 

一、expect语法构成:

  expect可单独写一个脚本:

    #!/usr/bin/expect -f 

    set timeout 5

    spawn COMAND

    expect PATTERN0 {

      send "STRING0\r"

      exp_continue  

    }

    expect {

      PATTERN1 {

          send "STRING1\r"

          exp_continue

        }

      PATTERN2 {

          send "STRING2\r"

          exp_continue

        }

    }

    expect "PATTERN3"

    exp_send "STRING3\r"

  以上混用了三种不同的expect书写格式;

  其中,PATTERN默认只支持glob通配规则(*和?等),只需-re PATTERN 即可支持扩展正则表达式匹配了。

  注意:所有{ } 的前面都需要一个空格隔开;

二、子命令解释:

  set   创建变量,[lindex $argv 0] 表示引用脚本参数中的第一个值;[lindex $argv 0-2] 表示引用脚本参数中第0到2个值。

        set timeout # 设置等待交互执行结束的超时时间并继续执行下去,为 -1 永不超时;

  send   =exp_send 用于向进程发送字符串,支持换码符,\r 表示回车;
      选项:
        -i 指定spawn_id,针对不同spawn对象来发送信息;是进行多程序控制的关键参数
        -s 表示slowly,控制发送速度,send -s 相当于 send_slow
          send -s {10 .001} 表示每10个字符一传送,传送间隔为1毫秒
  expect   从进程中接受字符串,类似触发器的启动;
      expect包含的子命令:
        exp_continue:表示继续执行expect流,并默认重置超时时钟;
        -continue_timer 不重置超时时钟,继续计时,超时则忽略,不推荐;
        exp_send : 是send的别名,完全相同的用法;(所有exp_command都是command的别名,完全等同)
  spawn     启动新的子进程;每个spawn都有一个spawn_id
  interact    保持交互状态,默认spawn启动子进程执行目标命令,并且控制权会在执行命令结束后交还给原来的进程(即用户可以输入了!),

      通过interact帮助维持子进程的交互,这个操作在ssh时很重要;又比如ftp交互完成传输一个文件后,可以通过interact,使得用户仍停留在ftp的CLI。

  exec COMMAND    用于支持bash命令。默认expect不支持bash命令。
        close     主动断开和当前进程的连接(主要取消计时机制,提高效率),而不是默认地从交互窗口中读取EOF来中断;
        exit        退出expect脚本的命令,可以通过exit执行一些收尾工作:

        exit -onexit{  

          exec rm /tmp/a

        }

      其中-onexit选项是必须的,是后面的参数执行后,再推出expect命令。

 

三、使用案例:

    A主机免密登录B主机(B主机IP:192.168.0.2 用户名:root  密码:123456):

    选择直接用expect来写脚本auto_ssh.exp:

      #!/usr/bin/expect

      set timeout 10      

      # 注意:expect不支持同一行内的注释信息出现,只能换行注释

      set password [lindex $argv 0] 

      # 取脚本后的第一个参数作为密码,因此使用格式为: ./auto_ssh.exp 123456

      spawn ssh root@192.168.0.2

      expect "password:"
      send "$password\r"
      interact

    以上简单地实现免密登录主机B。

Linux之expect命令免交互实现

标签:inux   启动   执行命令   回车   index   原理   设置   发送信息   cli   

原文地址:https://www.cnblogs.com/temagenie/p/9469587.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!