zoukankan      html  css  js  c++  java
  • shell中expect免交互

    expect
    前言
    观察ssh登录的交互现象
    有些程序难以避免的需要交互。你该如何解决脚本与程序的交互问题?
    名词解释
    期待, 预期, 盼望, 预料,料想, 指望, 希望, 要求,想, 认为
    一、概述

    我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。

    Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。:)

    Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。

    二、Expect工作原理

    从最简单的层次来说,Expect的工作方式象一个通用化脚本工具。用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。

    脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。
    解决人机交互的问题
    安装

            yum install -y expect tcl tclx tcl-devel
    

    示例1:
    通过expect解决ssh交互问题
    1 通过expect编写脚本
    示例

    #!/usr/bin/expect
    spawn ssh root@192.168.0.111
    
    expect {
            "yes/no" { send "yes
    ";exp_continue }
            "password:" { send "666666
    " };
    }
    interact
    

    2 登录验证免交互
    解释
    spawn expect 内部命令,启动一个shell程序。
    expect 期望哪些内容
    yes/no 就send发送 yes , 表示回车
    password 就send发送 centos
    exp_continue,跳过循环,就继续下一条语句。
    interact 允许用户交互
    示例2:
    expect实战:公钥推送
    准备工作:安装expect,准备公钥
    1 通过shell循环判断在线主机

    #!/bin/bash
    #创建一个IP地址文件。
    >ip.txt
    #使用for循环ping测试主机是否在线。
    for i in {2..254}
    do
    {
    #学员请注意练习环境的IP地址,可能与示例中不同。
            ip=192.168.0.$i
            ping -c1 -W1 $ip &> /dev/null
            if [ $? -eq 0 ];then
            echo "$ip" >> ip.txt
            fi
            }&
    done
    

    vim ip.txt 观察在线主机
    2 通过expect进行交互

    #!/bin/bash
    #创建一个IP地址文件。
    >ip.txt
    #使用for循环ping测试主机是否在线。
    for i in {2..254}
    do
     {
    #学员请注意练习环境的IP地址,可能与示例中不同。
            ip=192.168.122.$i
            ping -c1 -W1 $ip &> /dev/null
            if [ $? -eq 0 ];then
            echo "$ip" >> ip.txt
    
    /usr/bin/expect <<-EOF
    set timeout 10
    spawn ssh-copy-id $ip
    expect {
            "yes/no" { send "yes
    "; exp_continue }
            "password:" { send "centos
    " }
    }
    expect eof
    EOF
            fi
            }&
    done
    wait
    echo "finishi..."
    
    #!/usr/bin/expect
    set timeout 10
    spawn ssh-copy-id 192.168.122.152
    expect {
            "yes/no" { send "yes
    "; exp_continue }
            "password:" { send "centos
    " }
    }
    

    3 优化脚本
    安装和公钥
    示例

    #!/bin/bash
    #创建一个IP地址文件。
    >ip.txt
    #检测expect是否安装,检测公钥是否创建。
    rpm -q expect &> /dev/null
    if [ $? -ne 0 ] ;then
            yum install -y expect
    fi
    if [ ! -f ~/.ssh/id_rsa ];then
            ssh-keygen -P "" -f ~/.ssh/id_rsa
    fi
    #使用for循环ping测试主机是否在线。之前插入安装和准备秘钥。
  • 相关阅读:
    [算法专题] 深度优先搜索&回溯剪枝
    [算法专题] 二分搜索&排序数组
    rand_1tom 产生 rand_1ton
    [LeetCode] Kth Largest Element in an Array
    进程控制(Note for apue and csapp)
    Transport Layer Protocols
    Internetworking
    Dynamic Programming | Set 4 (Longest Common Subsequence)
    Dynamic Programming | Set 3 (Longest Increasing Subsequence)
    Dynamic Programming | Set 2 (Optimal Substructure Property)
  • 原文地址:https://www.cnblogs.com/netflix/p/12122726.html
Copyright © 2011-2022 走看看