当前位置: 首页 > news >正文

Shell脚本:expect脚本免交互

Shell脚本:expect脚本免交互

expect脚本免交互

  • 一、免交互基本概述:
    • 1.交互与免交互的区别:
    • 2.格式:
    • 3.通过read实现免交互:
    • 4.通过cat实现查看和重定向:
    • 5.变量替换:
  • 二、expect安装:
    • 1.概述:
    • 2.作用:
    • 3.expect基本命令:
    • 4.实例:
    • 5.扩展:

一、免交互基本概述:

1.交互与免交互的区别:

(1)交互:人工发出指令控制程序的运行,程序收到人工相应指令后,做出相应的反应。

(2)免交互:程序按编写好的运行方式,进行指定指令操作,在这个过程中,不需要人工操作,自动化完成。

2.格式:

(1)基本格式:

命令 <<标记 例:  wc -l<<wang
>               >1
>               >2
>               >wang
标记             2

(2)总结:

1.标记可以使用任意字符,但必须是合法字符(EOF)

2.结尾的标记一定要顶格写,前面不能有任何字符

3.结尾后也不能有任何字符,包括空格

4.开头标记前后空格会被忽略

5.开头和结尾标记必须一致

3.通过read实现免交互:

[root@test1 opt]# read i <<EOF
> wang,bkpp
> EOF
[root@test1 opt]# echo $i
wang,bkpp

4.通过cat实现查看和重定向:

1.[root@test1 opt]# cat <<EOF #查看
> billkin
> ppkritt
> EOF
billkin
ppkritt
2.[root@test1 opt]# cat <<EOF>wen.txt #重定向
> chanyeol
> baekhyun
> EOF
[root@test1 opt]# cat wen.txt 
chanyeol
baekhyun

5.变量替换:

(1)变量替换:

[root@test1 opt]# vim chen.sh
file="chen.sh"
i="the best luck"
cat > $file <<EOF
i like $i
EOF
[root@test1 opt]# sh chen.sh 
[root@test1 opt]# cat chen.sh 
i like the best luck

(2)整体替换:

[root@test1 opt]# vim chen.sh
var="bkpp is real"
myvar=$(cat <<EOF
the summer in pruket
$var
EOF
)
echo $myvar
[root@test1 opt]# sh chen.sh 
the summer in pruket bkpp is real

(3)关闭免交互:

[root@test1 opt]# vim wang.sh
var="GREAT!i am going to school!"
myvar=$(cat <<'EOF'
today is monday
$var
EOF
)
echo $myvar
[root@test1 opt]# sh wang.sh 
today is monday $var

在这里插入图片描述

(4)补充:

1.[root@test1 opt]# vim kai.sh #去除行首的tab字符,但是不能去除空格
cat <<-'EOF'kokopoppower
EOF
[root@test1 opt]# sh kai.sh 
kokopoppower
2.[root@test1 opt]# vim kai.sh #多行注释
:<<EOFkokopoppower
EOF
[root@test1 opt]# sh kai.sh 

二、expect安装:

1.概述:

(1)建立在tcl之上的一个工具

(2)用于进行自动化控制和测试

(3)解决shell脚本中交互相关的问题

2.作用:

(1)判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回。

(2)只能捕捉由spawn启动的进程的输出。

(3)用于接收命令执行后的输出,然后和期望的字符串匹配。

3.expect基本命令:

(1)send(设置超时时间,指定变量):向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加\r(回车) 或者\n

(2)spawn:用于捕捉关键词,后面常跟一个linux执行命令。

(3)expect:用于判断上层捕捉输出的结果是否有指定字符,有则立即返回,没有则默认等待10s。

(4)exp_continue命令:expect多分支判断时使用。

(5)set命令:可用于设置变量、设置expect超时时间,默认是10s。

(6)结束符: expect eof 结束并返回原来环境,原来主机。interact 结束但是不会返回原来的地方,保持当前状态,当前主机。

4.实例:

(1)用免交互的方式给用户设置密码。

[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5spawn passwd lisiexpect "New passwd:"
send "123456\r"
expect "Retype new passwd:"
send "123456\r"expect eof
[root@test1 opt]# chmod 777 passwd.sh 
[root@test1 opt]# ./passwd.sh

在这里插入图片描述

(2)用传参方式实现免交互登录:

![10](C:\Users\yuyong\Desktop\笔记\图\10.png)[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5set username [lindex $argv 0]
set password [lindex $argv 1]spawn su - $usernameexpect "Password:"
send "$password\r"
expect "*]$"
send_user "ok"
expect eof

在这里插入图片描述

(3)用嵌入模式实现免交互:

[root@test1 opt]# vim passwd.sh 
#!/bin/bash
user=$1
password=$2
useradd $1
/usr/bin/expect <<-EOFspawn passwd $userexpect "新的 密码:"
send "${password}\r"
expect "重新输入新的 密码:"
send "${password}\r"
expect eof
EOF
[root@test1 opt]# chmod 777 passwd.sh 
[root@test1 opt]# ./passwd.sh wang 1233456 
useradd:用户“wang”已存在
spawn passwd wang
更改用户 wang 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

(4)用ssh实现免交互:

[root@test1 opt]# vim ssh.sh 
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $hostname
expect {"Connection refused" {send_user "ssh访问被拒绝\n"}"No route to host" {send_user "主机名/IP地址有误\n"}"yes/no" {send "yes\n";exp_continue}"password" {send "$password\n"}
}
interact

在这里插入图片描述

5.扩展:

(1)监控脚本写一个函数库,用定时任务调用,每月1号执行:

[root@test1 opt]# vim hanshu.sh #创建函数库
fx () {
df -h | awk -F "[ ,%]+" 'NR>1 {if($5>20){print $1"警告!"}}'
}
[root@test1 opt]# vim wang.sh #调用函数
. /opt/hanshu.sh
a=`fx`
echo $a
[root@test1 opt]# crontab -e#创建定时任务
0 0 1 * * /opt/wang.sh

在这里插入图片描述

(2)在实现ssh免交互登录的基础上,使它在密码出错的情况下,也可以免交互自动完成:

[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set ip       [lindex $argv 1]
set password [lindex $argv 2]spawn ssh $hostname@$ip
expect {    "connection refused" {send_user "ssh访问被拒绝\n"exit}"No route to host" {send_user "主机名/ip地址有误\n"exit}"yes/no" {send "yes\n";exp_continue}"password" {send "$password\n"}"Permission denied, please try again."}   interact
[root@test1 opt]# chmod 777 passwd.sh
[root@test1 opt]# ./passwd.sh root 192.168.174.13 123

在这里插入图片描述

(3)免交互实现fdisk的磁盘分区,格式化,挂载:

[root@test1 opt]# vim fdisk.sh#!/bin/bash
/usr/bin/expect <<-EOF
set timeout 5
spawn fdisk /dev/sdb
expect {"命令(输入 m 获取帮助):" { send "n\n";exp_continue}"Select (default p): " {send "p\n";exp_continue}"分区号 (1-4,默认 1):" {send "\n";exp_continue}"起始 扇区 (2048-41943039,默认为 2048):" {send "\n";exp_continue}"Last 扇区*" {send "+10G\nw\n";exp_continue}    
expect eof
}
EOFmkfs.xfs -f /dev/sdb1
mkdir /data
mount /dev/sdb1 /data
[root@test1 opt]# chmod 777 fdisk.sh 
[root@test1 opt]# ./fdisk.sh

在这里插入图片描述

相关文章:

Shell脚本:expect脚本免交互

Shell脚本&#xff1a;expect脚本免交互 expect脚本免交互 一、免交互基本概述&#xff1a;1.交互与免交互的区别&#xff1a;2.格式&#xff1a;3.通过read实现免交互&#xff1a;4.通过cat实现查看和重定向&#xff1a;5.变量替换&#xff1a; 二、expect安装&#xff1a;1.…...

王道考研计算机网络第二章知识点汇总

2.1.1物理层基本概念 电气特性和功能特性易混淆&#xff0c;注意区分。电气特性一般指的是某个范围&#xff0c;功能特性一般指的是电平所代表的含义。 2.1.2数据通信基础知识 同步传输是指发送方和接收方节奏是统一的&#xff0c;数据之间是没有间隔的是一个一个的区块。在键…...

06.05

1.二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 考虑一个最朴素的方法&#xff1a;先将 aaa 和 bbb 转化成十进制数&#xff0c;求和后再转化为二进制数。利用 Python 和 Java 自带的高精度运算&#xff0c;我们可以很简单地写出这…...

【虹科案例】虹科数字化仪在激光雷达大气研究中的应用

01 莱布尼茨研究所使用激光雷达进行大气研究 图 1&#xff1a;在 Khlungsborn 的 IAP 办公室测试各种激光器 大气研究使用脉冲激光束通过测量大气中 100 公里高度的多普勒频移和反向散射光来测量沿光束的温度和风速。返回的光信号非常微弱&#xff0c;会被阳光阻挡&#xff0c…...

Java抽象类介绍

1 问题 声明一个名为Employee的抽象类&#xff0c;其中包含name(姓名)和sex(性别)两个String类型的私有属性&#xff0c;并声明一个继承于Employee抽象类的子类Teacher。 2 方法 2.1 定义一个抽象类&#xff1a;Employee。 2.2 为Employee类设计一个抽象方法。 2.3实现抽象类Em…...

适配器模式的运用

文章目录 一、适配器模式的运用1.1 介绍1.2 适配器模式结构1.3 类适配器模式1.3.1 类适配器模式类图1.3.2 代码 1.4 对象适配器模式1.4.1 对象适配器模式类图1.4.2 代码 1.5 应用场景1.6 JDK源码解析1.6.1 字节流到字符流的转换类图1.6.2 部分源码分析1.6.3 总结 一、适配器模式…...

2023/6/8总结

MySQL必知必会 commit 和 rollback 的差异是commit会提交&#xff0c;而rollback不会&#xff0c;就好像是撤回。 使用保留点&#xff1a; 简单的rollback和commit语句就可以写入或者撤销整个事务处理&#xff0c;但是&#xff0c;只是对简单的事务处理才能这样做&#xff0…...

AIGC大模型之——以文生图介绍

一、什么是以文生图&#xff1f; 以文生图是AIGC ( AI Generated Content &#xff09;框架中的一个关键技术&#xff0c;通过文字描述&#xff0c;将文字转化为图像并展示出来。以文生图具有白动化程度高、精度高、可扩展性强、可定制化等优势&#xff0c;具有广泛的应用前景&…...

kali学习笔记(二)

一、关闭自动锁屏 关闭自动锁屏对于测试人员来说&#xff0c;可以按照自己的习惯来设置&#xff0c;不然kali会过十分钟就锁屏&#xff0c;有的时候会比较不方便。 1、使用root账号登录&#xff0c;在display设置选项中做如下设置。 2、把休眠选项关掉。 二、创建快照 关机创…...

avx指令集判断的坑

&#xff08;一&#xff09;背景 项目中依赖算法同学编写的算法模块&#xff0c;他们在使用avx&#xff0c;sse指令集来提高速度&#xff0c;结果在一些机器上崩溃&#xff0c;导致项目无法发版。 我给他们说&#xff0c;我们项目中使用了谷歌的 libyuv 库&#xff0c;也使用了…...

求内推,求明主!

个人资料: 性 别: 男 年 龄: 30岁 户 籍: 湖南衡阳 专 业: 计算机科学与技术 求职意向: Java软件开发工程师/JavaWeb开发工程师 现 居 地: 深圳市龙华新区 自考本科学历,6年工作经验(做过商城,APP,小程序,也研究多个开源案例,开源项目,并提交过PR) 自我评价: 做事积极主动,有责…...

第十三章:约束

第十三章&#xff1a;约束 13.1&#xff1a;约束(constraint)概述 为什么需要约束 ​ 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。 为…...

M.2 SSD接口详解

一、M.2简介 M.2接口是一种新的主机接口方案&#xff0c;可以兼容多种通信协议&#xff0c;如sata、PCIe、USB、HSIC、UART、SMBus等。 M.2接口是为超极本&#xff08;Ultrabook&#xff09;量身定做的新一代接口标准&#xff0c;以取代原来的mSATA接口。无论是更小巧的规格尺…...

在本地Windows 11 系统的桌面版Docker上搭建PlantUML

文章目录 在本地Windows系统的桌面版Docker上搭建PlantUML简介步骤步骤 1&#xff1a;安装Docker Desktop步骤 2&#xff1a;启动Docker Desktop步骤 3&#xff1a;拉取PlantUML镜像步骤 4&#xff1a;运行PlantUML容器步骤 5&#xff1a;访问PlantUML Web界面 结论参考资料 结…...

mysql的sql_mode模式

1、sql_mode是MySQL中的一个系统变量&#xff0c;用于设置服务器在执行SQL语句时的行为模式。它可以控制服务器的严格性和特性&#xff0c;包括数据校验、日期处理、空值处理等。 下面是一些常见的sql_mode模式及其作用&#xff1a; STRICT_ALL_TABLES&#xff1a;为所有存储…...

chatgpt赋能python:Python编程必备之OpenCV库下载与安装

Python编程必备之OpenCV库下载与安装 作为目前最热门的计算机视觉库之一&#xff0c;OpenCV在人工智能领域中发挥着巨大的作用。而Python作为一门强大的编程语言&#xff0c;在OpenCV的使用上也有其独特的优势。本文将介绍Python如何下载和安装OpenCV库&#xff0c;以及如何引…...

sparkSQL的使用

sparksql只能处理结构化数据 基于rdd构建dataframe对象 from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StringType, IntegerTypeif __name__ __main__:spark SparkSession.builder.appName(test).master(local[*]).getOrCreate()sc spa…...

gitignore的语法

.gitignore 文件是用来告诉 Git 哪些文件或目录不应该被跟踪的。下面是一些常见的 .gitignore 文件语法规则&#xff1a; 空行或以#开头的行将被 Git 忽略&#xff0c;可以用作注释。 星号 * 代表零个或多个任意字符。例如, *.txt 会匹配所有的 .txt 文件。 问号 ? 代表一个…...

长袋除尘器

长袋低压脉冲除尘器是具有先进水平的高效袋式除尘设备,是一种处理风量大、清灰效果好、除尘效率高、运行可靠、维护方便、占地面积小的大型除尘设备。 工作机理 1、过滤原理: 长袋低压脉冲除尘器含尘气体由进风口进入&#xff0c;经过灰斗时&#xff0c;气体中部分大颗粒粉尘…...

HTML+CSS实训——Day02——仿一个网易云音乐的登陆界面

仓库链接:https://github.com/MengFanjun020906/HTML_SX 前言 今天要继续完成我们的音乐软件了&#xff0c;昨天写完了封面&#xff0c;今天该完成开屏广告和登陆界面了。 登陆界面代码 <!DOCTYPE html> <html lang"en"> <head><meta charse…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...