Shell脚本基础篇——Expect免交互工具
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本次博客结构Expect概述Expect安装方法Expect基本命令Expect执行方式Demo实例Expect概述expect是一款自动化的脚本解释型的工具。它基于tcl脚本,其运行需要tcl的支持
千家信息网最后更新 2025年12月02日Shell脚本基础篇——Expect免交互工具
本次博客结构
- Expect概述
- Expect安装方法
- Expect基本命令
- Expect执行方式
- Demo实例
Expect概述
expect是一款自动化的脚本解释型的工具。它基于tcl脚本,其运行需要tcl的支持。expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。
在远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。
Expect安装方法
通常系统中不会安装expect,需要手动进行安装
系统为Centos时:
yum install expect -y
Expect基本命令
Timeout:指定超时时间,默认为10s
当timeout -1时代表永不超时
Send:向进程发送字符串,模拟用户输入
通常后面会跟"\r"代表回车换行
Spawn:启动进程,并追踪后续命令
Expect:对进程进行捕捉(只能捕捉spawn启动的进程)
判断上次输出结果里是否包含指定的字符串
Interact:将控制权交回控制台
$argv参数数组:接受从bash传递的参数
参数从0开始,代表第一个参数
Expect执行方式
分为两种主要执行方式:直接在expect解释器中进行执行、结合"<<"下一位的分界符进行嵌入执行。
直接执行
[root@localhost~]#more a.sh#!/usr/bin/expect //导入expect解释器 set timeout 20 //20秒超时时间 set hostname [lindex $argv 0] //追加参数0,加载第1位置 set password [lindex $argv 1] //追加参数1,加载第2位置 spawn ssh root@$hostname expect { "(yes/no)" //捕获关键字 {send"yes/r";exp_continue} //输入yes,继续下一步 "*password" //参数2 {send"$password\r"} //模拟人工输入 }interact //交回控制权回终端嵌入执行
这里解释一下"<<"的用法:
当shell看到"<<"的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。
"EOF"与"-EOF"两种分界符的不同:
"EOF"没有容错率,一旦结尾的分界符存在空格或者制表符,就会导致脚本报错。
"-EOF"有一定的容错率,结尾的分界符可以允许存在制表符。
[root@localhost~]#more b.sh#!/bin/bash //导入bash解释器 hostname=$1 password=$2 /usr/bin/expect<<-EOF //将EOF作为分界符,下面所有操作均停留在当前终端 spawn ssh root@${hostname} //启动进程,开始追踪ssh命令 expect { "(yes/no)" {send "yes\r";exp_continue} "*password" {send"$password\r"} } expect "*]#" send "exit\r" expect eof //等待分界符结束EOF //另一位分界符,代表操作结束Demo实例
直接执行Demo
#!/usr/bin/expect #超时时间 set timeout 20log_file test.log log_user 1#参数传入set hostname [lindex $argv 0]set password [lindex $argv 1]#追踪命令spawn ssh root@$hostname#捕捉信息并且匹配,免交互执行expect { "Connection refused" exit "service not known" exit "(yes/no)" {send "yes\r";exp_continue} "*password" {send "$password\r"}}#控制权交给控制台执行interactexit效果如下

嵌入执行Demo
#!/bin/bashuser=$1password=$2#非交互命令放在expect外useradd $user#开始进行交互expect <<-EOFspawn passwd $userexpect "新的*"send "${password}\r"expect "重新*"send "${password}\r"expect eof;EOF#以上为脚本实际内容效果如下:

参数
命令
输入
进程
控制
解释
脚本
代表
时间
字符
字符串
控制权
方式
时候
解释器
位置
内容
制表符
实例
密码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
机关网络安全维护 确保
公共网络安全监察官网
美军网络安全吗
网络安全读研
网络技术课题工作内容
关系型数据库表中的行称
vb开发的软件开发环境
数据库写个拦截器
服务器机房怎么做
有道服务器
深圳巡检软件开发怎么收费
河北网络技术服务热线
手机服务器代理地址
网技支队网络安全岗位
芒果T互联网科技有限公司
社会考生单招选计算机网络技术
软件开发专业学什么
莱州安卓软件开发推荐
主机r星服务器可以直连么
奥能网络技术开发
什么叫无线传感器网络技术
辽宁公司生鲜配送软件开发
网站服务器 美洲
口袋觉醒服务器维修
联想服务器主机e5-2680
emoji无法插入数据库
魔兽世界服务器平衡人口
直播铅山网络安全
注册表是数据库么
软件开发过程中的问题总结