expect 是一个免费的编程工具语言,对于交互的场合,实现自动和交互式任务进行通信,而无需人的干预。
expect 安装:yum install -y expect
expect 脚本定义:默认以“.expect” 为后缀。脚本语言在首行要指明语言工具:#!/usr/bin/expect
expect 由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后send 发送特定的响应。
变量定义
expect通过 set 命令定义变量。
变量来源有两种形式:
set a 1
直接定义 变量和 值。set host [lindex $argv 0]
通过获取脚本传递过来的参数定义变量,实现交互。
spawn创建子进程
expect 通过 spawn 创建一个执行program args命令的进程。它的stdin,stdout,stderr(标准输入,标准输出,标准错误输出)都连到Expect。
如通过spawn创建一个SSH连接,并通过 expect捕捉stdout标准输出信息,再通过 send 向spawn生成的进程 输入 相关命令。
#1登录示例#!/usr/bin/expectset use rootset passwd 123456!set host 192.168.20.2spawn ssh $user@$hostexpect {"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窗口执行完成命令。有以下三种方法:
- 通过 命令
expect eof
,表示需要读取到文件结束符或到expect 默认时间。- 通过 命令
interact
,在执行完成spawn任务后保持交互状态,把控制权交给控制台。这时候可通过手工操作。- 通过 命令
set timeout 10
设置 环境变量 timeout 来保持 spawn等待时间。
# 假如通过SSH登录远程主机后,拷贝文件,那么就需要expect进程等待拷贝完成。set timeout 10 #第3种方法spawn rsync -av $file root@$host:$file#或是 expect eot# 或是 interact
#同步脚本名为ryn.expect .本地shell调用。# 1远程主机列表和同步文件列表。cat ../ip.list192.168.10.2192.168.10.5cat ../file.list1.txt2.txt#本地shell脚本cat ../rsync.sh#!/bin/bashfor ip in `cat ip.list`doecho $ip ./ryn.expect $ip list.txtdone# 本地expect同步脚本cat ../ryn.expect#!/usr/bin/expectset 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
联系客服