Shell脚本基础篇——Expect免交互工具
发表于:2025-01-26 作者:千家信息网编辑
千家信息网最后更新 2025年01月26日,本次博客结构Expect概述Expect安装方法Expect基本命令Expect执行方式Demo实例Expect概述expect是一款自动化的脚本解释型的工具。它基于tcl脚本,其运行需要tcl的支持
千家信息网最后更新 2025年01月26日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安全错误
数据库的锁怎样保障安全
非比网络技术有限公司
互联网品牌永春科技
win7服务器3389端口
ibatis查询数据库编码
贵州智能养老软件开发
数据库插入数据出现问号
软件开发 质量目标
笨马网络技术服务有限公司
吉林先进网络技术排名靠前
js数据存到数据库中
c 数据库加减
网络安全管理现状调研
centos 邮箱服务器
违反网络安全法名称
重庆网络安全和信息化工作
数据库社交三范式
想学软件开发应该选哪个专业
web服务器管理工具
软件开发公司的科目设置
网络安全条列
golden db数据库原理
提取其他系统的数据库信息
成图软件开发
企业网络安全资质有哪些
微信在服务器保存多久
天津机架式服务器云主机
项目软件开发进度计划
计算机三级网络技术CSDN
微信pc版代理服务器
学习计算机网络技术哪个学校好