[转帖]详解自动交互命令expect,免去手动输入!

详解,自动,交互,命令,expect,免去,手动,输入 · 浏览次数 : 0

小编点评

**expect脚本使用说明** **1. 导入** 首先,使用 `expectset` 命令导入所需的库,例如 `lindex` 和 `send_user`: ```bash /bin/expectset password \"guoke123\"puts $password ``` **2. 条件语句** 可以使用 `if` 语句来处理不同的条件: ```bash if { $argc != 3 } { send_user "usage:expect $argv0 file id host" exit } ``` **3. 循环和管道** 可以使用循环和管道来处理多个文件或输出: ```bash for i in *; do set id [lindex $argv $i] set host [lindex $argv $i] ... done ``` **4. 特殊参数** `expect` 支持一些特殊参数,例如: * `$argc`:传参个数 * `$argv0`:脚本名称 **示例** 以下是一个示例,展示了如何使用条件语句、循环和管道处理多个文件: ```bash # 创建文件测试1.log touch test1.log # 创建文件测试2.log touch test2.log # 创建文件测试3.log touch test3.log # 创建文件测试4.log touch test4.log # 使用expect设置文件路径 set src_file [lindex $argv 0] set dst_file [lindex $argv 1] set host [lindex $argv 2] set username [lindex $arv 3] set password [lindex $arv 4] # 使用expect设置用户名和密码 spawn scp $src_file $username@$host:$dst_file ``` **注意** * `expect` 的文件名必须以 `.exp`结尾。 * `expect` 使用的是 `$argv` 的参数索引,因此 `$argv[0]` 代表第一个参数,`$argv[1]` 代表第二个参数,以此类推。 * 使用 `expect` 需要安装 `expect` 库。可以使用 `sudo apt-get install expect` 来安装。

正文

https://zhuanlan.zhihu.com/p/192470248

 

#概述
expect是一个用来实现自动交互功能的软件套件,是基于TCL的脚本编程工具语言,方便学习,功能强大

#扩展TCL:全拼为Tool Command Language ,是一种脚本语言,由John Ousterout创建。TCL功能很强大,经常被用于快速原型开发,脚本编程,GUI和测试等方面

#使用背景
在执行系统命令或程序时,有些系统会以交互式的形式要求输出指定的字符串之后才能执行命令,如用户设置密码,一般都是需要手工输入2次密码,再如SSH登录的,如果没有做免密钥登录,第一次连接要和系统实现两次交互式输入

#安装
yum install expect

#自动交互工作流程
spawn启动指定进程--->expect获取期待的关键字-->send向指定进程发送指定字符-->进程执行完毕,退出结束

相关使用命令

#1.spawn命令
在expect自动交互程序执行的过程中,spawn命令是一开始就需要使用的命令。通过spawn执行一个命令或程序,之后所有的expect操作都会在这个执行过的命令或程序进程中进行,包括自动交互功能,因此如果没有spawn命令,expect程序将会无法实现自动交互
#语法
spawn [选项] [需要自动交互的命令或程序]

#示例
spawn ssh root@192.168.1.1 uptime
#在spawn命令的后面,直接加上要执行的命令或程序(例如这里的ssh命令)等,除此之外,spawn还支持如下一些选项
-open: 表示启动文件进程
-ignore:表示忽略某些信号
#提示:使用spawn命令expect程序实现自动 交互工作流程的第一步,也是最关键的一步

#2.expect命令
expect命令的作用就是获取spawn命令执行后的信息,看看是否和其事先指定的相匹配。一旦匹配上指定的内容就执行expect后面的动作,expect命令也有一些选项,相对用的较多的是-re,使用正则表达式的方式来匹配
#语法
expect 表达式 [动作]

#示例
spawn ssh root@192.168.1.1 uptime
expect "*password" {send *123456\r"}
#提示:上述命令不能直接在linux命令行中执行,需要放入expect脚本中执行

#示例
ssh远程登录机器执行命令,首次登录需要输入yes/no和输入密码

[root@game scripts]# cat ssh.exp 
#!/usr/bin/expect
​
spawn ssh root@192.168.228.137 "free -m"
expect {
    "yes/no" {exp_send "yes\r";exp_continue}
    "*password" {exp_send "guoke123\r"}
}
expect eof
#参数说明
exp_send和send类似。\r(回车)
匹配多个字符串的时候,需要在每次匹配并执行动作后,加上exp_continue

#3.send命令
即在expect命令匹配指定的字符串后,发送指定的字符串给系统,这些命令可以支持一些特殊转义符号,例如:\r表示回车、\n表示换行、\t表示制表符等

#参数
-i: 指定spawn_id,用来向不同的spawn_id进程发送命令,是进行多程序控制的参数
-s: s代表slowly,即控制发送的速度,使用的时候要与expect中的标量send slow相关联

#4.exp_continue命令
作用是让expect程序继续匹配的意思 #如

expect {
    "yes/no" {exp_send "yes\r";exp_continue}
    "*password" {exp_send "guoke123\r"}
}

#因为后面还有匹配的字符,所以需要加上exp_continue,否则expect将不会自动输入指定的字符串,最后一个就不需要加上exp_continue了

#5.send_user命令
send_user命令可用来打印expect脚本信息,类似shell里的echo命令
#用法

[root@game scripts]# cat send_user.exp 
#!/usr/bin/expect
​
send_user "guoke\n"
send_user "youtiao.\t" #tab键,没有换行
send_user "what hao\n"
​
#效果
[root@game scripts]# expect send_user.exp 
guoke
youtiao.    what hao

#6.exit命令
exit命令的功能类似于shell中的exit,即直接退出expect脚本,除了最基本的退出脚本功能之外,还可以利用这个命令对脚本做一些关闭前的清理和提示等工作

expect程序变量

#1.普通变量
expect中的变量定义,使用方法与TCL语言中的变量基本相同

#语法
set 变量名 变量值

#示例
set user "guoke"

#打印变量语法
puts $变量名

#例子

[root@game scripts]# cat test1.exp 
#!/usr/bin/expect
set password "guoke123"
puts $password
​
#效果
[root@game scripts]# expect test1.exp 
guoke123

#2.特殊变量
在expect里也有与shell脚本里的$0、$!、$#等类似的特殊参数变量,用于接收及控制expect脚本传参

在expect中$argv表示参数数组,可以使用[lindex $argv n]接收expect脚本传参,n从0开始,分别表示第一个[lindex $argv 0]参数、第二个[lindex $argv 1]参数、第三个[lindex $argv 2]参数.....

[root@game scripts]# cat test2.exp 
#!/usr/bin/expect

set file [lindex $argv 0]
set id [lindex $argv 1]
set host [lindex $argv 2]
puts "$file\t$id\t$host\n"
send_user "$file\t$id\t$host\n"

#效果
[root@game scripts]# expect test2.exp test.log 1 192.168.1.1
test.log    1   192.168.1.1
test.log    1   192.168.1.1

#扩展
除了基本的位置参数外,expect也支持其他的特殊参数,例如:$argc表示传参的个数,$argv0表示脚本的名字。

#示例

[root@game scripts]# cat test2.exp 
#!/usr/bin/expect

set file [lindex $argv 0]
set id [lindex $argv 1]
set host [lindex $argv 2]
puts "$file\t$id\t$host\n"
puts $argc
puts $argv0

#效果
[root@game scripts]# expect test2.exp test.log 1 192.168.1.1
test.log 1 192.168.1.1
3 #传参的总数
test2.exp #脚本的名字

expect中的if条件语句

#语法

if {条件表达式} {
    指令
}

或
if {条件表达式} {
    指令
} else {
    指令
}

#提示:if关键字后面要有空格,else关键字前后都要有空格,{条件表达式}大括号里面靠近大括号出可以没有空格,将指令括起来的起始大括号”{“ 前要有空格

#示例1
#使用if语句判断脚本传参的个数,如果不符合则给予提示

[root@game scripts]# cat test3.exp 
#!/usr/bin/expect
​
if { $argc != 3 } {
    send_user "usage:expect $argv0 file id host\n"
    exit
}
​
set file [lindex $argv 0]
set id [lindex $srgv 1]
set host [lindex $argv 2]
puts "$file\t$id\t$host\n"
​
#效果
[root@game scripts]# expect test3.exp 
usage:expect test3.exp file id host

#示例2 #使用if语句判断脚本传参的个数,不管是否符合都给予提示

[root@game scripts]# cat test4.exp 
#!/usr/bin/expect
if {$argc != 10} {
    send_user "bey.\n"
} else {
    send_user "ok\n"
}

#效果
[root@game scripts]# expect test4.exp 
bey.

expect中的关键字

#介绍
expect中的特特殊关键字用于匹配过程,代表某些特殊的含义或状态,一般只用于expect命令中而不能在expect命令单独使用

#1.eof关键字
eof(end-of-file文件结尾)关键字用于匹配结束符
#示例

[root@game scripts]# cat ssh.exp 
#!/usr/bin/expect
​
spawn ssh root@192.168.228.137 "free -m"
expect {
    "yes/no" {exp_send "yes\r";exp_continue}
    "*password" {exp_send "guoke123\r"}
}
expect eof

#2.timeout关键字
timeout是expect中的一个控制时间的关键字变量,它是一个全局性的时间控制开关,可以通过为这个变量赋值来规定整个expect操作的时间,注意这个变量是服务于expect全局的,而不是某一条命令,即使命令没有任何错误,到了时间仍然会激活这个变量,此外,到时间后还会激活一个处理及提示信息开关,
#示例

[root@game scripts]# cat ssh.exp 
#!/usr/bin/expect

spawn ssh root@192.168.228.137 "free -m"
expect {
 -timeout 3
    "yes/no" {exp_send "yes\r";exp_continue}
    "*password" {exp_send "guoke123\r"}
 timeout {puts "request timeout;return"}
}
#效果
[root@game scripts]# expect ssh.exp 
spawn ssh root@192.168.228.137 free -m
request timeout #当时间超过3秒就会打印超时退出

#应用例子
1.复制文件

[root@game scripts]# cat scp.exp 
#!/usr/bin/expect

set src_file [lindex $argv 0]
set dst_file [lindex $argv 1]
set host [lindex $argv 2]
set username [lindex $arv 3]
set password [lindex $arv 4]

spawn scp $src_file $username@$host:$dst_file
expect {
    -timeout 15
    "yes/no" {exp_send "yes\r";exp_continue}
    "*password" {exp_send "guoke123\r"}
    timeout {puts "request timeout";return}
}
expect eof

#效果
[root@game scripts]# expect scp.exp test.txt test.txt 192.168.228.137 root guoke123
spawn scp test.txt root@192.168.228.137:test.txt
root@192.168.228.137's password: 
test.txt                             100%    3     3.4KB/s   00:00   

#到目标主机上查看
[root@zabbix ~]# ls -l test.txt 
-rw-r--r-- 1 root root 3 Aug 20 05:32 test.txt

与[转帖]详解自动交互命令expect,免去手动输入!相似的内容:

[转帖]详解自动交互命令expect,免去手动输入!

https://zhuanlan.zhihu.com/p/192470248 #概述expect是一个用来实现自动交互功能的软件套件,是基于TCL的脚本编程工具语言,方便学习,功能强大 #扩展TCL:全拼为Tool Command Language ,是一种脚本语言,由John Ousterout创

[转帖]如何在本地编译安装部署自动化回归测试平台 AREX

https://zhuanlan.zhihu.com/p/613877597 AREX 官方 QQ 交流群:656108079 本文将详细为大家介绍一下自动化回归测试平台 AREX 以及如何在本地进行编译安装部署。 背景 AREX 是一款开源的自动化回归测试工具, 基于 Java Agent 技术,

[转帖]如何在本地编译安装部署自动化回归测试平台 AREX

https://zhuanlan.zhihu.com/p/613877597 AREX 官方 QQ 交流群:656108079 本文将详细为大家介绍一下自动化回归测试平台 AREX 以及如何在本地进行编译安装部署。 背景 AREX 是一款开源的自动化回归测试工具, 基于 Java Agent 技术,

[转帖]pod 调度详解:亲和、污点和容忍

文章目录 兔子的故事自动调度定向调度亲和性调度nodeAffinityPodAffinityPodAntiAffinity 污点和容忍污点(Taints)查看污点设置污点删除污点 容忍 (toleratints)Pod 设置容忍Deployment 中设置容忍设置容忍时间容忍示例 污点驱逐 兔子的故

[转帖]【JVM】堆内存与栈内存详解

堆和栈的定义 java把内存分成栈内存和堆内存。 (1)栈内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。 当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另

[转帖]Linux系统下cpio命令详解

简介 cpio主要是解压或者将文件压缩到指定文件中即copy-in和copy-out模式。 参数说明 参数参数说明-icopy-in模式,解压文件-ocopy-out模式,即压缩文件-d自动生成目录-v打印处理的文件-m保留文件修改的时间 具体操作 [root@localhost casper]#

[转帖]别让运维太忙,一文详解 Ansible 的自动化运维

https://zhuanlan.zhihu.com/p/270655214 一、Ansible 概述 Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。 Ansible 通过本身集成的非常丰富的模块可以实现各种管

[转帖]SC 命令详解

http://blog.chinaunix.net/uid-13461264-id-2886987.html SC 命令详解 SC 是用于与服务控制管理器通信的命令行程序。SC.exe可以用来测试你自己的系统,你可以设置一个批处理文件来使用不同的参数调用 ,用SC.exe来控制服务,如果你想看看服务

[转帖]万字详解 JVM,让你一文吃透

https://my.oschina.net/u/4526289/blog/5588880 摘要:本文将带大家详细地了解关于 JVM 的一些知识点。 本文分享自华为云社区《【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列》,作者: 冰 河 。 JDK 是什么? JDK 是用于支

[转帖]Linux下的I/O复用与epoll详解

https://blog.csdn.net/weixin_39094034/article/details/110393127 前言 I/O多路复用有很多种实现。在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性