expect的使用

本文介绍如何利用Expect工具实现SSH登录自动化,包括安装、基本命令使用、流程控制及参数解析,帮助读者掌握通过脚本自动执行远程主机管理任务的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用expect

安装expect
安装依赖:yum install tcl -y
安装expect:Centos系统yum install expect -y或Ubuntu系统apt-get install expect -y

一些基本的expect命令

spawn :启动新进程,用于执行shell命令;
expect :从发起交互的命令的进程接受字符串,用于匹配我们预想的字符串;
send :用于向发起交互的命令的进程发送字符串;
interact:允许用户交互,即此命令后,交互将不会由expect进行,将交回给用户

示例
在这里插入图片描述

/usr/bin/expect: 表示使用expect来解释该脚本。

set timeout 30: 表示设置超时时间,这里是表示超时时间为30秒,默认为10秒,用于执行shell命令的时间,如果执行的shell命令时间较长(如传输文件),则需要设置长一点。

set username “root” : 表示设置并定义了变量username,变量值为"root"。

spawn ssh username@username@username@host ls: 表示使用spawn来执行ssh username@username@username@host ls 命令,该命令只有在expect环境里才能执行,所以直接在命令行输入或没有安装expect则会报错,它的主要功能是给它后面的shell命令运行进程加了个壳,进行传递交互的内容,注意,如果用引号将变量引起,将可能导致错误extra characters after close-quote…,如果执行的命令需要用到引号,使用双引号,并使用\转义,但只适用于命令中只有一对引号的情况,如果出现多对引号,将会出现一些奇怪的错误,暂时不知道如何解决。

expect “password”: 表示从spawn执行的命令的进程里接受字符串,一般是弹出终端的交互行的标准输入提示信息,如需要你确定时的(yes/no?),需要你输入密码的(…password:)。这里因为ssh命令的交互内容是叫你输入密码,交互提示的内容有password,所以这里匹配password。需要注意的是,expect接受的是spawn执行的命令进程中可能出现的字符串,如果你的spawn执行的命令在执行完之后直接没有进程了,那expect也将不能匹配到任何的字符串,如sapwn简单的执行ls等命令,这也说明expect多用于需要执行连接的场景。

send “KaTeX parse error: Can't use function '\r' in math mode at position 9: password\̲r̲”: 表示当expect命令匹…password发送给spawn执行的命令的进程,完成交互,相当于手动输入$password,这里的\r代表回车,也可以使用\n,记得加上\r或\n,否则脚本将可能会卡死。

expect eof: 表示结束expect,读取到文件结束符 ,当spawn发送指令到终端执行时在返回时被expect捕捉时,在起始会有一个eof,就好比在shell中 cat >>file <<EOF… EOF一样,在结束时也要有eof;expect eof有时间限制,即我们设置的超时时间,默认10秒,不过可能出现的问题是,如果是在传输一个大文件,可能在文件还没传输完成便断开了命令执行,此时需要设置超时时间长一点或 set timeout -1,或将expect eof改成expect -timeout -1 eof。

interact: 执行完命令后,控制权交互控制台,此时再有交互,expect将不会进行交互,需要手动进行输入内容交互。如果没有这句,在需要交互的ssh命令执行完毕后将会退出远程,而不是继续保持在远程。

expect参数

$argc:表示命令行参数个数
[lindex $argv n]:表示index为n的参数(index从0开始计算),index的区间为左闭右开,如[lindex $argv 0]代表命令行输入的第一个参数,[lindex $argv 0 3] 代表命令行输入的第一到第三个参数 。

示例
在这里插入图片描述

expect流程控制
if语句

在这里插入图片描述

**expect {}**: 多行期望,从上往下匹配,匹配成功里面的哪一条,将执行与之的send命令,注意,这里面的匹配字符串只会执行一个,即匹配到的那个,其余的将不会执行,如果想匹配这句命令执行成功后(如登录成功后等待输入的root@ubuntu:~#)的其他字符,需要另起一个expect命令,并保证不在expect{}里面。

puts与send_user: 打印信息,类似echo

其他:
判断条件用{}包含
花括号与花括号,和括号与控制语句之间需要有空格,否则会报错expect:extra characters after close-brace
if右边要有左花括号,else左边要有右花括号,不能单独一行

for语句:

在这里插入图片描述
while语句:

在这里插入图片描述

函数定义和调用:
使用proc定义函数,使用时输入函数名和参数调用

在这里插入图片描述

expect数组:
在这里插入图片描述

其他的一些内容
使用正则匹配:使用 -re选项,expect -re “\[(.)]” 其中[在expect shell 正则中都有特殊意义,因此要\三次 ,如果spawn执行的命令不能匹配通配符,需要在spawn 后加 bash -c。

expect -i选项:已交互的方式运行expect。

expect -D选项:交互式的调试器,类似gdb。

expect -c选项:可执行命令的前置符,expect命令可在命令行执行,该选项-c后的命令需要引号引起来,引号内多个命令分号隔开,可使用多次-c选项,空格隔开。

expect -f选项:常见于文件第一行,即#!/usr/bin/expect -f ,指定expect读取的expect命令文件,可选项,该选项会将文件一次性全部读取入内存,加上-f选项可以为执行expect提供更多参数。

expect -b选项:类似-f选项,只是每次只读取一行,即可以逐行的执行expect。

拼接字符串:使用append命令append “hello”$user",welcome!"

sleep:脚本进入睡眠,使用和其他语言一样,直接跟数字即可,单位为秒。

exit:退出

foreach:对指定集合的每一个元素,依次赋值给变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值