目录
一:expect语言
1.1:expect简介
EXPECT是一个用来实现自动交互功能的软件套件(EXPECT is a software suite for automating interactive tools),用于提供自动交互的工具。
1.2:expect应用场景
设想一个场景:比如你要用ssh或者 telnet登录服务器的时候,命令行下提示需要输入用户和密码等。
如果叫你用shell脚本写自动登录脚本的话是不是有点困难呢? 你会说在shell中执行ssh命令的话,他会一直停在那里等你密码啊,这个要手工来做才行吧?
Expect就是为处理这类情况而设计的工具,简单来说它可以控制、处理输入,输出流,然后提供自动填写数据等需要用户交互式输入的数据的地方实现自动化处理。
Expect就是为了处理“自动交互”的工具。
Expect 支持自定义的脚本,所以你通过编写自定义脚本就可以实现你想要的自动填写数据功能了。
1.3:expect工作流程
expect的工作流程可以理解为:
spawn启动进程---->expect期待关键字---->send向进进程发送字符—>退出结束。
1.4:expect语法
1.4.1:spawn
spawn命令是expect的初始命令。
它用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法执行了。
spawn使用方法如下:
spawn ssh [email protected]
// 在spawn命令后面,直接加上要启动的进程、命令等信息
1.4.2:expect
expect 命令用于等候一个相匹配内容的输出,一旦匹配上就执行expect后面的动作或命令,语法如下:
expect 表达式 动作 表达式 动作...
从上面的例子可以看出:expect是依附与spawn命令的,当执行ssh命令后,expect就匹配命令执行后的关键字: password。
如果匹配到关键字就会执行后面包含在{}括号中的exp_send动作,匹配以及动作可以放在二行,这样就不需要使用{}括号了,就像下面这样,实际完成的功能与上面是一样的
1.4.3:exp_send 和send
exp_send命令或send命令是expect中的动作命令,
用于向进程发送字符串,支持换码符,\r 表示回车
使用方法如下:
1.4.3:timeout
timeout 是expect中的一个重要变量。
它是一个全局的时间控制开关,你可以通过为这个变量赋值来规定整个expectc操作的时间。
注意这个变量是服务与expect全局的,它不会纠缠某一条命令,即使命令没有任何错误,到时间依然会激活这个变量。
使用方法如下:
timeout 变量中,设置为0表示立即超时,-1则表示永久不超时。
1.4.3:expect eof
与spawn对应表示捕获终端输出信息终止。
1.4.4:set
set 创建变量
[lindex $argv 0] 表示引用脚本参数中的第一个值;
[lindex $argv 0-2] 表示引用脚本参数中第0到2个值。
$argv,参数数组,使用[lindex $argv n]获取,$argv 0为脚本名字
# $argc,参数个数
set username [lindex $argv 1] # 获取第1个参数
set passwd [lindex $argv 2] # 获取第2个参数
1.4.5:interact
interact 保持交互状态
默认spawn启动子进程执行目标命令,并且控制权会在执行命令结束后交还给原来的进程(即用户可以输入了!),
通过interact帮助维持子进程的交互,这个操作在ssh时很重要;又比如ftp交互完成传输一个文件后,可以通过interact,使得用户仍停留在ftp的CLI。
二:使用expect实现ssh自动登录
2.1:实现思路
按照一般ssh登录的步骤,可得到实现思路:执行ssh命令远程登录ssh服务器等待ssh服务器端返回输入用户名与密码的界面输入用户名与密码实现登录
2.2:编程实现
/usr/bin/expect
spawn ssh root@ip
expect {
"yes/no" {
send "yes\r";exp_continue } #\r表示回车
"password:" {
send "123456\r"}
}
expect "]#"
send "ifconfig\r"
send "exit\r"
expect eof
send {
ifconfig ens33|grep -w inet |awk '{print $2}'}
send "\r"
send "exit\r"
expect eof
三:使用expect与scp实现自动文件传输
3.1:实现思路
启动scp命令服务端返回输入用户名与密码界面发送用户名密码完成登录
3.2:编程实现
四:使用expect实现ftp自动文件上传
4.1:实现思路
实现思路:启动命令服务器返回输入用户名密码界面发送用户名密码完成登录服务器返回命令操作界面发送操作命令退出
4.2:编程实现
#!/usr/bin/expect
spawn ftp localhost #执行ftp命令
expect "Name*" #如果出现Name字符
send "ftp\n" #则输入ftp并回车
expect "ftp>*"
send "cd pub/other\n"
expect "ftp>*"
send "put /tmp/123.txt xo.txt\n"
expect {
"150 Ok to send data" {
send_user "upload sucessfull!";send "quit\n" } #send_user 类型shell的echo命令
"553*" {
send_user "upload error!";send "quit\n" }
}
expect eof #expect eof,与spawn对应,表示捕捉终端输出信息终止,类似if...endif