Linux命令-expect命令
expect
可以实现shell实现不了的用户交互的需求。expect
可以将交互写在一个脚本上,完成很多自动化的动作,比如ssh
、ftp
登陆等,都是需要交互需求的。
expect
是需要安装的,直接yum -y install expect
安装即可。
expect
的四个关键命令为:spawn
、expect
、send
、set
,其中spawn
是调用要执行的命令,expect
是等待命令提示信息的出现也即捕捉用户提示信息,send
是发送需要交互的信息来替代手工的输入,set
则是输入变量值。
1.命令格式:
1 | expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile] [ args] |
2.命令功能:
expect
是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect
就是一套用来实现自动交互功能的软件。
在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect
,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。这就是expect
!!!
3.工作流程:
except的工作流程可以理解为: spawn启动进程 –> expect期待关键字 –> send向进程发送字符 –> 退出结束
4.命令参数:
1 | -c, 从命令行执行expect脚本,默认expect是交互地执行的 |
expect常用命令总结:
1 | spawn 交互程序开始,后面跟命令或者指定程序 |
5.expect语法:
5.1.spwan
spwan命令是expect的初始命令,它启动一个进程,之后所有expect操作都在这个进程中进行,其使用方法如下:
1 | spwan ssh root@192.168.1.26 |
在spwan命令后面,直接加上要启动的进程、命令等信息,除此之外,还支持其他选项:
1 | -open, 启动文件进程,具体说明请自行查阅 |
5.2.expect
使用方法:
1 | expect 表达式 动作 表达式 动作 ... ... |
expect命令用于等候一个相匹配内容的输出,一旦匹配则执行expect后面的动作命令,这个命令接收几个特有参数,用的最多的就是-re,表示使用正则表达式进行匹配,如下:
1 | spwan ssh root@192.168.1.26 |
expect是依附与spwan命令的,当执行ssh命令后,expect就会匹配命令执行后的输出,然后执行expect后面包含在{}中的send
或exp_send
动作,匹配及动作可以放在下一行,就可以省略{},如下:
1 | spwan ssh root@192.168.1.26 |
5.3.exp_send和send
exp_send是expect中的动作,send和其作用一样。exp_send命令可以发送一些特殊符号:
1 | \r, 回车 |
5.4.exp_continue
这个命令一般用在动作中,它被使用的条件比较苛刻,例子:
1 | !/usr/bin/expect |
个人理解:spwan后面的命令的输出,从第一行开始进行expect遍历匹配,若匹配则执行动作,不匹配则进行下条匹配,而exp_continue的作用是,若不匹配则跳过此行输出,并进行第二行输出进行expect的匹配
5.5.send_user
send_user用于把后面的参数输出到标准输出中去,默认的send
、exp_send
都是将参数输出到程序中去,用法:
1 | send_user "please input password:" |
这样就可以在标准输出中打印please input password:
字符了。
1 | !/usr/bin/expect |
5.6.exit
exit命令功能很简单,就是直接退出脚本,但可以利用这个命令做一些扫尾工作,如:
1 | exit -onexit { |
6.expect变量:
expect中有很多有用的变量,他们的使用方法与TCL中的变量相同,如:
1 | set 变量名 变量值 # 设置变量的方法 |
7.expcct关键字:
expect中的关键字用于匹配过程,代表某些特殊含义或状态,一般用于expect命令中而不能在外面使用,也可以理解为事件,如:
1 | expect eof {} |
7.1.eof
eof(end-of-file)关键字用于匹配结束符,比如文件、ftp传输停止等,在这个关键字后跟上动作来做进一步的控制,特别是ftp交互操作方面,他的作用很大,如:
1 | spawn ftp root@192.168.1.26 |
interact也是关键字,可以是当前停留在服务端,交互模式使用
7.2.timeout
timeout是expect中的一个重要变量,它是一个全局性的时间控制开关,你可以通过为这个变量赋值来规定整个expect操作的时间,注意这个变量是服务与expect全局的。例子:
1 | set timeout 60 |
先将超时间设置为60秒,当程序阻塞到60秒,就会激活timeout动作。
另一种设置timeout的方法,如下:
1 | spwan ssh root@192.168.1.26 |
7.使用实例:
实例1:进行远程拷贝(#!/usr/bin/expect)
1.sh:
1 | !/usr/bin/expect |
执行:./1.sh
或者expect 1.sh
,不能使用sh 1.sh
或bash 1.sh
实例2:进行远程拷贝(#!/bin/sh或者#!/bin/bash)
2.sh:
1 | !/bin/sh |
执行:expect 2.sh
实例3:进行远程拷贝—推荐使用此方法
3.sh:
1 | !/bin/sh |
执行:./3.sh
、sh 3.sh
或bash 3.sh
实例4:进行远程拷贝(最终版本)
1 | !/bin/sh |
实例5:expect执行多条命令
1 | set timeout 10 |