zoukankan      html  css  js  c++  java
  • linux通过expect实现脚本自动交互

    1、安装步骤

    ①首先,准备好所需的两个安装包

    tcl8.4.13-src.tar.gz(链接:https://pan.baidu.com/s/1yTFtr1zZbYkBnIenm-HWGg ,提取码:h8ed )

    expect-5.43.0.tar.gz(链接:https://pan.baidu.com/s/1ZdJo-nRI_FnUYiMzkKqkhA ,提取码:90g5 )

    ②安装tcl8.4.13

    Tcl 的 configure 脚本有一个语法错误,下面的命令可以纠正它:

    sed -i "s/relid'/relid/" configure (8.4.13不再有这样的错误了)

    编译tcl

    cd unix
    
    ./configure --prefix=/expect
    
    make
    
    make install
    
    mkdir -p /tools/lib

    需要的内容都拷贝到/tools/lib目录

    cp tclConfig.sh /tools/lib/

    安装完毕完先不要删除源码,以会安装expect还要用到

    将/tools/bin目录export到环境变量,

    ③安装expect

    ./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no

    如果报

    checking for Tcl private headers... checking for tclInt.h... no

    configure: error: Can't find Tcl private headers

    就再添加一个头文件目录参数

    --with-tclinclude=../tcl8.4.13/generic,即:

    ./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no --with-tclinclude=../tcl8.4.13/generic

    脚本运行正常,进行执行make进行编译

    make

    编译过程中未出现错误,执行安装:

    make install

    编译完成后会生在/tools/bin内生成expect命令

    . .bash_profile

    此时在命令行执行expect应该可以执行了! 

    ④完成安装

    下面就可以做expect的工作了!

    以下转自:https://mp.weixin.qq.com/s/oM6084HOzpS6mp1RQQoUpg

    2 expect的常用命令

    命令

    说明

    spawn

    启动新的交互进程, 后面跟命令或者指定程序

    expect

    从进程中接收信息, 如果匹配成功, 就执行expect后的动作

    send

    向进程发送字符串

    send exp_send

    用于发送指定的字符串信息

    exp_continue

    在expect中多次匹配就需要用到

    send_user

    用来打印输出 相当于shell中的echo

    interact

    允许用户交互

    exit

    退出expect脚本

    eof

    expect执行结束, 退出

    set

    定义变量

    puts

    输出变量

    set timeout

    设置超时时间

    3、 作用原理简介

    3.1 示例脚本

    这里以ssh远程登录某台服务器的脚本为例进行说明, 假设此脚本名称为remote_login.sh:

    #!/usr/bin/expect
    
    set timeout 30
    spawn ssh -l root 172.16.22.131
    expect "password*"
    send "123456
    "
    interact

    3.2 脚本功能解读

    (1) #!/usr/bin/expect

    上述内容必须位于脚本文件的第一行, 用来告诉操作系统, 此脚本需要使用系统的哪个脚本解析引擎来执行.具体路径可通过command -v expect命令查看.

    注意:这里的expect和Linux的bash、Windows的cmd等程序一样, 都是一种脚本执行引擎.脚本需要有可执行权限(chmod +x remote_login.sh, 或chmod 755 auto_login.sh), 然后通过命令./remote_login.sh运行即可;如果输入sh remote_login.sh, 意义就不一样了: 明确调用sh引擎去执行此脚本, 此时首行的#!/usr/bin/expect就失效了.

    (2) set timeout 30

    设置连接的超时时间为30秒.(3) spawn ssh -l root 172.16.22.131spawn、send等命令是expect工具中的内部命令, 如果没有安装expect工具, 就会出现"spawn not found"等错误.

    不要用which spawn之类的命令去找spawn, 因为并没有这样的程序.

    (4) expect "password*"

    这个命令用来判断上次输出结果里是否包含"password*"的字符串, 如果有则立即返回, 否则就等待一段时间后返回. 这里的等待时长就是前面设置的timeout, 也就是30秒.

    (5) send "123456 "

    这里就是执行交互动作, 作用等同于手工输入密码.提示: 命令字符串结尾加上 , 这样的话, 如果出现异常等待的状态就能够停留下来, 作进一步的核查.

    (6) interact

    expect执行完成后保持用户的交互状态, 这个时候用户就可以手工操作了.如果没有这一句, expect执行完成后就会退出脚本刚刚远程登录过去的终端, 用户也就不能继续操作了.

    4 其他脚本使用示例

    4.1 直接通过expect执行多条命令

    注意首行内容, 这种情况下就只能通过./script.sh来执行这类脚本了:

    #!/usr/bin/expect -f
    
    set timeout 10
    # 切换到root用户, 然后执行ls和df命令:
    spawn su - root
    expect "Password*"
    send "123456
    "
    expect "]*"         # 通配符
    send "ls
    "
    expect "#*"         # 通配符的另一种形式
    send "df -Th
    "
    send "exit
    "       # 退出spawn开启的进程
    
    expect eof          # 退出此expect交互程序

    4.2 通过shell调用expect执行多条命令

    注意首行内容, 这种情况下可通过sh script.sh、bash script.sh 或./script.sh, 都可以执行这类脚本:

    #!/bin/bash
    
    ip="172.16.22.131"
    username="root"
    password="123456"
    
    # 指定执行引擎
    /usr/bin/expect <<EOF
        set time 30
        spawn ssh $username@$ip df -Th
        expect {
            "*yes/no" { send "yes
    "; exp_continue }
            "*password:" { send "$password
    " }
        }
        expect eof
    EOF

    5 spawn not found 的解决

    出现这个错误的基本上都是出学者: Linux 执行shell脚本有两种方式:

    一种是将脚本作为sh的命令行参数, 如sh remote_login.sh, 或sh /data/remote_login.sh;一种是将脚本作为具有执行权限的可执行脚本, 如./remote_login.sh, 或/data/remote_login.sh.

    而作为sh命令行参数来运行, 那么脚本第一行的#!/usr/bin/expect就会失效, 所以才会出现spawn not found、send not found等错误, 所有上面的automate_login.sh脚本必须用以下命令运行:

    ./automate_expect.sh

     

  • 相关阅读:
    我真的没读野鸡大学!是他们不好好起名字!
    Request.Cookies和Response.Cookies
    深受理科生喜欢的10大专业
    如何玩转“互联网+教育”?
    js调试工具Console命令详解
    XSS获取cookie并利用
    257. Binary Tree Paths
    EXEC sp_executesql with multiple parameters
    235. Lowest Common Ancestor of a Binary Search Tree
    226. Invert Binary Tree
  • 原文地址:https://www.cnblogs.com/lynsen/p/11663587.html
Copyright © 2011-2022 走看看