ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

0 SHELL训练营--day10_expect

2018-12-30 11:01:10  阅读:210  来源: 互联网

标签:


expect

expect 是一个免费的编程工具语言,对于交互的场合,实现自动和交互式任务进行通信,而无需人的干预。
expect 安装:yum install -y expect
expect 脚本定义:默认以“.expect” 为后缀。脚本语言在首行要指明语言工具:#!/usr/bin/expect
expect 由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后send 发送特定的响应。

  • 变量定义

    expect通过 set 命令定义变量。
    变量来源有两种形式:

    1. set a 1 直接定义 变量和 值。
    2. set host [lindex $argv 0] 通过获取脚本传递过来的参数定义变量,实现交互。
  • spawn创建子进程

    expect 通过 spawn 创建一个执行program args命令的进程。它的stdin,stdout,stderr(标准输入,标准输出,标准错误输出)都连到Expect。
    如通过spawn创建一个SSH连接,并通过 expect捕捉stdout标准输出信息,再通过 send 向spawn生成的进程 输入 相关命令。

    #1登录示例
    #!/usr/bin/expect
    set use root
    set passwd 123456!
    set host 192.168.20.2
    spawn ssh $user@$host
    expect {
    "yes/no" { send "yes\r"}  # 遇到包含"yes/no"的标准输出信息时,通过send发送确认信息。
    "password:" { send "$passwd\r" }
    }
    expect "#*"  
    send "pwd\r"
  • 延时功能

    需要注意的是spawn是expect环境下,expect语言内部命令。它生成的进程执行完成后,会自动退出。
    通过spawn生成的进程,可通过send向远程的服务器传递命令,这个命令执行是远程主机生成的tty窗口执行,而不是在本地的spawn进程中执行。这两个进程,在命令的运行时间 ,会产生冲突。
    如:spawn完成任务后,退出进程,从而关闭生成的远程连接TTY窗口,但这窗口下的命令未完成,就会达不到任务需要的效果。
    可通过 设置 spawn延时来 等待 TTY窗口执行完成命令。有以下三种方法:

    1. 通过 命令 expect eof ,表示需要读取到文件结束符或到expect 默认时间。
    2. 通过 命令 interact ,在执行完成spawn任务后保持交互状态,把控制权交给控制台。这时候可通过手工操作。
    3. 通过 命令 set timeout 10 设置 环境变量 timeout 来保持 spawn等待时间。
# 假如通过SSH登录远程主机后,拷贝文件,那么就需要expect进程等待拷贝完成。
set timeout 10   #第3种方法
spawn rsync -av $file root@$host:$file
#或是 expect eot
# 或是 interact

构建文件分发系统

  1. 目标是通过spawn远程登录服务器,执行rsync命令将本地文件推送到远程主机上。
  2. 通过本地shell调用expect脚本,传递远程主机和同步文件参数。
    #同步脚本名为ryn.expect .本地shell调用。
    # 1远程主机列表和同步文件列表。
    cat ../ip.list
    192.168.10.2
    192.168.10.5
    cat ../file.list
    1.txt
    2.txt
    #本地shell脚本
    cat ../rsync.sh
    #!/bin/bash
    for ip in `cat ip.list`
    do
    echo $ip
        ./ryn.expect $ip list.txt
    done
    # 本地expect同步脚本
    cat ../ryn.expect
    #!/usr/bin/expect
    set host [lindex $rage 0]
    set filelist [lindex $ragv 1]
    set passwd "123!45"
    spawn rsync -av --files-from=$filelist root@$host:/
    expect{
    "yes/no"{ send "yes\r" }
    "password" { send "$passwd\r" }
    }
    expect eof

标签:
来源: http://blog.51cto.com/sincethen/2337076

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有