SHELL中之 expect

本文介绍如何在Shell脚本中嵌入Expect实现密码自动化输入,包括Expect的基本使用、命令行参数处理、条件语句及多行期望匹配。并展示了如何在Shell中调用Expect脚本来实现远程登录。

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

一.在shell脚本中嵌入expect来实现密码输入

expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send)

1.安装expect 

需要先安装tcl:apt-get install tcl

apt-get install expect

 

2.expect使用

2.1一个简单的输入密码操作

#!/usr/bin/expect

set timeout 100

set password "123456"

spawn sudo rm -rf zzlogic

expect "root123456"

send "$password\n"

interact

 

说明:

第一行#!/usr/bin/expect表示使用expect的shell交互模式

set是对变量password赋值

set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10秒

 

spawn在expect下执行shell脚本

expect对通过spawn执行的shell脚本的返回进行判断,是否包含“”中的字段

send:如果expect监测到了包含的字符串,将输入send中的内容,\n相当于回车

interact:退出expect返回终端,可以继续输入,否则将一直在expect不能退出到终端

 

2.2expect的命令行参数

[lindex $argv n]获得index为n的参数(index从0开始计算)

$argc为命令行参数的个数

[lrange $argv 0 0]表示第一个参数

[lrange $argv 0 3]表示第1到第3个参数

 

例如scp_service.sh文件,可以./scp_service.sh -rm来执行,这时是赋值了一个参数

set option  [lindex $argv 0](获得第一个参数存到变量option中,参数是的index是从0开始计算的)

 

2.3if...elif...else...

expect支持if语句,

if {条件1} {

     条件1执行语句

} elif {条件2} {

     条件2执行语句

} else {

     其他情况执行语句

}

说明:

1.if的条件用{}来包含条件

2.if和后面的{}必须有空格隔开

3.两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace

3.使用{来衔接下一行,所以if的条件后需要加左花括号{

4.else不能单独放一行,所以else要跟在}后面

2.4 expect {},多行期望,匹配到哪条执行哪条

背景:有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}

花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。

 

3.shell中调用expect来实现登录

我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。可以见我下图调用的一个例子

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天行健自强不息的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值