zoukankan      html  css  js  c++  java
  • expect交互脚本

    expect是一个免费的编程工具语言,用来实现自动和交互式任务通信的编程工具语言。

    toc

    expect 安装

    源码包安装需要先 Tcl 库,因为expect是在 Tcl 基础上创建起来的,所以这里我就不用源码包安装了,直接用yum安装

    ## expect 在base源,这里我用的是阿里云的YUM源,有base源可以忽略
    [root@Shell ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    [root@Shell ~]# yum makecache
    ## 用yum安装expect
    [root@Shell ~]# yum install expect -y

    expect基础应用

    • expect脚本一般以 #!/usr/bin/expect 开头
    • expect脚本常以.exp或者.ex结束。
    • expect主要命令
      • spawn 新建一个由expect控制的进程
      • expect 等待接受进程返回的字符串,直到超时时间
      • send 发送字符串给expect控制的进程
      • set 设定变量
      • exp_continue 重新从当前expect块的开始执行
      • [lindex argv0]expect11
      • [lindex argv1]expect22
      • set timeout -1 设置超时时间为永远等待
      • set timeout 30 设置超时时间为30秒
      • interact 保持当前状态,并把控制权交给用户
      • expect eof 等待spawn进程结束后退出

    expect 实现用ssh密码交互登陆

    #!/usr/bin/expect
    ## 设定变量password等于123.com
    set password 123.com
    ## 新建一个进程,执行ssh命令
    spawn ssh root@192.168.1.2
    expect {
        ## 当询问
        "yes/no" { send "yes
    "; exp_continue }
        "password" { send "$password
    " }
    }
    interact

    expect 进行参数传递,ssh登陆之后创建用户 yunxiang 并设置密码

    #!/usr/bin/expect
    ## 位置参数传递
    set ip [lindex $argv 0]
    set user root
    set password 123.com
    set passwd 456.com
    ## 响应等待5秒,超时进入下一条
    set timeout 5
    spawn ssh $user@$ip
    expect {
        "yes/no" { send "yes
    "; exp_continue }
        "password" { send "$password
    " };
    }
    # 当出现 # 号符执行如下命令
    expect "#"
    send "useradd yunxiang
    "
    send "passwd yunxiang
    "
    expect {
        "New password:" { send "$passwd
    "; exp_continue }
        "Retype new password:" { send "$passwd
    " }
    }
    send "exit
    "
    ## 都执行完了就退出
    expect eof

    最后用 Shell+expect 批量获取在线主机, 进行秘钥批量分发

    #!/usr/bin/bash
    password="123.com"
    ## 清空ip.txt文件
    >ip.txt
    ## 使用循环把ping通ip放到ip.txt文件中
    for i in {2..10}
    do
        ip=192.168.1.$i
        {
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
            echo "$ip" >> ip.txt
        fi
        }&
    done
    ## 生成对应的密钥
    if [ ! -f ~/.ssh/id_rsa ];then
        ssh-keygen -P "" -f ~/.ssh/id_rsa
    fi
    ## 把ip.txt文件以每行循环
    while read line
    do
        ## 调用expect
        /usr/bin/expect <<-EOF
        set timeout 5
        spawn ssh-copy-id $line -f
        expect {
            "yes/no" { send "yes
    "; exp_continue }
            "password:" { send "$password
    " }
        }
        expect eof
        EOF
    done<ip.txt
    #!/bin/bash
    password="123"
    > ip.txt
    if [ ! -f ~/.ssh/id_rsa ]
    then
        ssh-key-id -P "" -f ~/.ssh/id_rsa
    fi
    for i in {2..10}
    do
        ip=192.168.1.$i
        ping -c 1 -W 1 $ip > /dev/null
        if [ $? -eq 0 ]
        then
            /usr/bin/expect <<-EOF
            set timeout 5
            spawn ssh-copy-id $ip -f
            expect {
                "yes/no" { send "yes
    "; exp_continue }
                "password" { send "$password
    " }
            }
            expect eof
            EOF >> ip.txt
        fi
    done
  • 相关阅读:
    Simulink仿真入门到精通(一) Simulink界面介绍
    Learn Regex The Easy Way
    C语言程序设计(十三) 文件操作
    C语言程序设计(十二) 结构体和共用体
    C语言程序设计(十一) 指针和数组
    C语言程序设计(十) 字符串
    C语言程序设计(九) 指针
    C语言程序设计(八) 数组
    C语言程序设计(七) 函数
    C语言程序设计(六) 循环控制结构
  • 原文地址:https://www.cnblogs.com/songguoyou/p/11884253.html
Copyright © 2011-2022 走看看