• Expect 小脚本



    简介:

    Expect 可以替系统管理员完成与系统的交互式操作

    shell > yum -y install expect # 可以通过 yum 安装
    
    shell > which expect # 路径
    /usr/bin/expect

    例一:

    shell > cat login.exp
    #!/usr/bin/expect
    
    spawn ssh root@192.168.1.81;
    expect {
    "(yes/no)?" { send "yes
    "; exp_continue }
    "password:" { send "123456
    "; exp_continue }
    "#" { send "uptime
    "; interact }
    }

    ## 使用 /usr/bin/expect 来解释脚本 , spawn 开启一个 ssh 进程 , expect 用来接收信息 , send 用来发送信息
    "(yes/no)?" 当第一次登陆远程主机时会提示 yes/no , 匹配到信息时 send 发送 "yes " , 为换行 , exp_continue 为继续匹配下一条
    "#" 由于是 root 用户登陆 , 那么匹配到正确的密码后会得到超级用户的标志 # 号 , 然后就可以 send 发送系统命令了 uptime
    interact 指令意为:保持交互状态 , 将控制权交给控制台 , 也就是说刚登陆到远程主机 , 现在不会退出 , 且管理员可以操作主机

    例二:

    shell > cat login.exp
    
    #!/usr/bin/expect
    set timeout -1;
    spawn ssh root@192.168.1.81;
    expect {
    "(yes/no)?" { send "yes
    "; exp_continue }
    "password:" { send "123456
    "; exp_continue }
    "#" { send "uptime
    exit
    "; expect eof }
    }

    ## set timeout -1 : 设置超时时间 , -1 为无穷大、可以指定例如 20 (单位为秒)
    expect eof : 等待进程结束 (不保持交互状态), 当执行命令中没有明确指定退出登陆(exit )时 , expect eof 会等到超时时间过后自
    动退出远程系统(timeout 设为 -1 时 , 不会退出 ) , 如果明确指定 exit (即上面例子)时 , 则执行完命令立即退出远程登陆系统

    例三:

    shell > cat login.sh
    
    #!/bin/bash
    list=("192.168.1.81 root 123456" "192.168.1.82 root 123456" "192.168.1.83 root 123456")
    length=${#list[@]}
    
    for ((i=0;i<$length;i++))
    {
    host=`echo ${list[$i]} | awk '{print $1}'`
    user=`echo ${list[$i]} | awk '{print $2}'`
    passwd=`echo ${list[$i]} | awk '{print $3}'`
    
    expect -c "
    spawn ssh $user@$host;
    expect {
    "(yes/no)?" { send "yes
    "; exp_continue }
    "password:" { send "$passwd
    "; exp_continue }
    "#" { send "uptime
    exit
    "; expect eof }
    }
    "
    }

    ## expect -c 从命令行执行 expect 脚本 现在可以实现循环登陆服务器执行命令后退出远程系统
    将 exit 去掉 , 并且 expect eof 改为 interact 可以实现停留在远程服务器(只限一台服务器 , 如过多台的话第一台停留就不会循环了)

    例四:

    shell > cat login.exp1
    
    #!/usr/bin/expect
    if { $argc != 3 } {
    puts "usage $argv0 user host passwd"
    exit 1
    }
    
    set user [lindex $argv 0]
    set host [lindex $argv 1]
    set passwd [lindex $argv 2]
    
    spawn ssh $user@$host;
    expect {
    "(yes/no)?" { send "yes
    "; exp_continue }
    "password:" { send "$passwd
    "; exp_continue }
    "#" { send "uptime
    "; interact }
    }

    ## $argc 代表参数个数 , $argv0 代表脚本名 , $argv 0 代表第一个参数 ...
    如果传递参数不足 3 个 , 那么屏幕显示 usage 脚本名 user host passwd , 所以执行脚本时应: ./login.exp1 root 192.168.1.81 123456
    参数不足 3 个则退出脚本
    set 将第一个参数赋值给变量 user ...( 变量存储从 0 开始计算 1 2 3 ... n )

  • 相关阅读:
    遗忘
    2008年第一篇1.15
    键盘对应值
    油田开采基础知识
    最近
    oracle中lob数据的操作
    [转]大数据能做什么,大数据和云是不是一回事?
    [转]从这些方面判断一家公司的好坏
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    谈创新
  • 原文地址:https://www.cnblogs.com/wangxiaoqiangs/p/5336486.html
Copyright © 2020-2023  润新知