当前位置:首页 > 技术 > 正文内容

使用 Expect 实现自动化交互操作

访客 技术 2026年6月4日 1

自动化处理交互式命令的利器:Expect

在 Linux 系统管理中,某些命令需要手动输入密码或确认信息,难以直接通过脚本自动完成。此时,Expect 提供了一个简洁高效的解决方案。它是一种基于 Tcl 的工具,专门用于模拟用户与交互式程序之间的对话,无需深入掌握 C 或 Perl 等复杂语言即可编写自动化脚本。

安装与调用方式

Expect 并非系统默认安装组件,可通过包管理器快速部署:

yum -y install expect

脚本中调用 Expect 支持两种常见模式:

  • 独立脚本模式:将脚本首行指定为 #!/usr/bin/expect,使其可直接执行。
  • 嵌入 Shell 脚本:在 Bash 脚本中使用 Here Document 方式调用,格式如下:
/usr/bin/expect << 'EOF'
# expect 命令块
EOF

核心语法与关键指令

以下是 Expect 脚本中最常用的命令及其作用说明:

变量定义(set)

使用 set 关键字声明变量:

set username "admin"
set timeout 60

其中 timeout 控制等待响应的最大时长(单位:秒),设为 -1 表示永不超时。

启动进程(spawn)

spawn 用于开启一个需要交互的子进程,例如 SSH 登录、FTP 连接等:

spawn ssh admin@192.168.10.5

该命令必须在 Expect 环境下运行,普通 shell 中无法识别。

匹配输出(expect)

expect 指令监听程序输出,并根据关键字做出响应。支持单条件和多分支写法:

expect "password:"
send "mypassword\r"

或多路匹配:

expect {
    "yes/no" { send "yes\r"; exp_continue }
    "password:" { send "secret\r" }
    timeout { puts "连接超时"; exit 1 }
}

使用 exp_continue 可在触发某条件后继续监听后续输出。

发送输入(send)

send 向目标程序发送字符串,通常以 \r 结尾表示回车确认:

send "ls -l /home\r"

保持交互(interact)

若希望脚本执行后将控制权交还给用户,可使用:

interact

否则脚本将在任务完成后自动退出。

参数传递

Expect 可接收外部传入的参数,使用 lindex $argv n 获取第 n 个参数(从 0 开始计数):

set host [lindex $argv 0]
set pwd  [lindex $argv 1]

实战示例

示例一:Expect 脚本实现 SSH 自动登录

#!/usr/bin/expect
set host "192.168.1.6"
set user "root"
set pass "123456"
set timeout 30

spawn ssh $user@$host
expect "password:"
send "$pass\r"

expect "#"
send "echo 'Hello from remote' > /root/greeting.txt\r"

send "exit\r"
expect eof

运行后将在远程主机生成指定文件,全过程无需人工干预。

示例二:Shell 脚本中集成 Expect 实现自动化

#!/bin/bash
TARGET_IP="192.168.1.6"
USERNAME="root"
PASSWORD="123456"

/usr/bin/expect << EOF
set timeout 30
spawn ssh $USERNAME@$TARGET_IP
expect {
    "yes/no" { send "yes\r"; exp_continue }
    "password:" { send "$PASSWORD\r" }
}
expect "#"
send "mkdir -p /root/testdir && touch /root/testdir/status.log\r"
send "exit\r"
expect eof
EOF

此方法便于在已有 Bash 脚本中灵活嵌入自动化交互逻辑。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。