shell脚本-免交互

一、Here Document免交互:

1.交互概述:

交互:当计算机播放某多媒体程序的时候,编程人员可以发出指令控制该程序的运行,而不是程序单方面执行下去,程序在接受到编程人员相应的指令后而相应地做出反应。

对于Linux操作系统中,有许多操作都会触及到交互(根据系统的指示做出相对应的操作满足操作者的需求),对于shell脚本的自动化运维,就要实现免交互来达到自动化运维的效果。

常用的交互程序:read,ftp,passwd,su,sudo,fdisk等等 

 cat 也可配合免交互的方式重定向输出到文件。

2.Here Doucument 的作用和格式:

Here Document 的作用:

  • 使用I/O重定向的方式将命令列表提供给交互式程序
  • 标准输入的一种替代品

 语法格式:

命令 <<标记
.......
内容			#标记之间是传入内容
.......
标记

注意事项:

  • 标记可以使用任意合法字符(通用的字符是EOF
  • 结尾的标记一定要顶格写,前面不能有任何字符
  • 结尾的标记后面也不能有任何字符(包括空格)
  • 开头标记前后的空格会被省略掉

示例:

统计行数

免交互方式实现对行数的统计,将要统计的内容置于标记"EOF"之间

3.Here Document 的使用:

3.1 cat命令的读取:

覆盖文件:

追加文件:

3.2 tee命令:

tee和cat相似,但tee 可以直接生成文件

选项:

-a内容追加到给定的文件而非覆盖
-i忽略中断信号

3.3 read :

read只读取第一行输入的内容

3.4 passwd 用户修改密码:

4.Here Document 变量的使用:

Here Document 也支持使用变量,如果标记之间有变量被使用,会先替换变量值。如 果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。如果写入 的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入。

4.1变量替换实际值:

#!/bin/bash
file="EOF1.txt"
var="Zhuzi"
cat > $file <<EOF
Hi,my name is $var
EOF

4.2 整行内容作为变量并输出结果:

#!/bin/bash
file="1.txt"
var="park"
my=$(cat <<EOF >$file
I am going to the $var
EOF
)
echo $my

4.3 交互内容中输出变量:

#!/bin/bashx="nihao"
y=$(cat <<EOF
111
222
$x
EOF
)
echo "$y"

4.4 使输出内容换行:

#!/bin/bash
var="Me too!"
myvar=$(cat <<EOF
How are you?
I'm fine,And you?
$var
EOF
)
echo "$myvar"

 4.5 多行注释:

#!/bin/bash
file="zs.txt"
var="bamboo"
myvar=$(cat <<EOF >$file
My name is $var.
How old are you?
Do you want play with me?EOF
)
echo $myvar
###下面部分就被注释了不会显示
:<<EOF
echo "My name is $var."
echo "Do you want play with me?"
EOF

4.6去除tab键的影响:

tab键的空行

解决方法:

再EOF前添加 -

4.7  完成自动划分磁盘免交互:

fdisk /dev/sdb <<EOF
> n
> p
> 
> 
> 
> 
> w
> EOF

二. Expect进行免交互:

1.Expect 定义:

Expect建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试主要解决shell脚本中交互相关的问题。

使用expect命令前需要先进行安装tcl与expect软件,在安装expect软件自动安装依赖包tcl
先检查系统内是否安装expect软件包。

检查expect安装包和依赖包tcl是否安装

没有安装使用:yum install expect -y 安装 

 2.Expect的基本使用:

2.1脚本解释器的声明:

Expect 脚本中首先引入文件,表明使用的是哪一个 shell

#!/usr/bin/expect

2.2 spawn——启动进程并捕捉交互信息:

 spawn 后面通常跟一个 Linux 执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息(监控  捕捉)

2.3 expect——从进程接收字符串:
  • 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
  • 只能捕捉有swpan启动的进程输出;
  • 用于接受命令执行后的输出,然后和期望的字符串匹配

2.4——send 用于向进程发送字符串:

  • 向进程发送字符串,用于模拟用户的输入;
  • 该命令不能自动回车换行,一般要加\r (回车)或者\n
方式一:
expect "密码" {send "abc123\r"}     #同一行send部分要有{}方式二:
expect "密码"  
send "abc123\r"                    # 换行send部分不需要有{}方式三:
expect 支持多个分支
expect          #只要匹配了其中一个情况,执行相应的send 语句后退出该expect 语句
只匹配一次
expect
{
{"密码1"  {send "abc123\r"}
{"密码2"  {send "123123\r"}
{"密码3"  {send "123456\r"}}

2.5.结束符:

expect eof:

表示交互结束,等待执行结束,退回到原用户,与 spawn 对应。
比如切换到 root 用户,expect 脚本默认的是等待10s当执行完命令后,默认停留10s后,自动切回了原用户

interact:

执行完后保持交互状态,把控制权交给控制台会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact 后的命令不起作用;
使用 interact 会保持在终端而不会退回到原终端;

需要注意的是,expect eof 与 interact 只能二选一

2.6 exp_continue:

  • exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。
  • exp_continue 类似于控制语句中的 continue 语句。表示允许 expect 继续向下执行指令。
  • 并行执行,exp_continue 前面的匹配如果有就执行,没有就不执行;但后面的一定会执行。

2.7 set  设置会话超时时间:

expect 默认的超时时间是10秒,通过set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1

2.8 send_users:

表示回显命令,相当于 echo

2.9 接收参数:

expect 脚本可以接受从 bash 命令行传递参数,使用 [lindex $argv n] 获得。其中你从0开始,分别表示第一个,第二个,第三个.....参数

3.Expect 免交互的脚本运用:

3.1免交互传输文件:

#!/usr/bin/expectspawn scp /etc/passwd  172.16.195.4:/opt
#监控scp命令,出现scp命令开始捕捉屏幕内容expect {"yes/no"  {send  "yes\n";exp_continue}"password" {send "123\n";}
}
#捕捉屏幕上的关键字,出现yes/no输入yes
#exp_continue 代表继续捕捉password
#出现 password 输入密码。 \n  \r 回车expect eof
#代表结束

3.2 免交互修改用户密码:

#!/usr/bin/expext#脚本用于实现免交互修改gg用户的密码set timeout 2
#设置超时时间为2秒,默认情况是10秒spawn passwd gg
#spawn追踪后面指令产生的交互过程expect "新的密码"
send "123123\r"
expect "重新输入新的密码"
send "123123\r"
#匹配交互过程中的提示信息
#send 相当于echo,传送在该交互过程中你的预设值expect eof
#结束符

3.3 免交互ssh远程登陆:

#!/usr/bin/expect
#开启ssh命令,ssh后面跟要远程控制的IP地址
spawn ssh 172.16.195.4
expect {"yes/no" { send "yes\n";exp_continue }"password" { send "123123\n"}}
interact

3.4 su 命令切换用户:

#!/usr/bin/expectset timeout 1set username [lindex $argv 0]
set password [lindex $argv 1]spawn su $usernameexpect "密码"
send "$password\n"expect "*]$"
send_user "$username 切换成功!"interact

3.5 免交互fdisk分区操作:

#!/usr/bin/expectset timeout 2
set name [lindex $argv 0]spawn fdisk $name
expect "获取帮助"
send "n\r"
expect "Select"
send "p\r"
expect "分区号"
send "\r"
expect "起始"
send "\r"
expect "Last"
send "+10G\r"
expect "命令"
send "w\r"interact

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

铁轨语义分割(Unet结合resnet系列)

数据介绍 一类是图片&#xff0c;一类是图像标签。 引入库&#xff0c;处理数据 import torch.nn as nn import torch import torch.nn.functional as F import os from PIL import Image import torch from torch.utils.data import Dataset import torchvision.transfor…

Unity SRP 管线【第七讲:URP LOD实现以及Reflections反射探针】

目录 一、URP LOD 组件1、LOD Group的使用2、LOD切换原理Cross Fade(淡入淡出)模式Animated Cross-Fading如果未设置Clip&#xff0c;并且Fade Transition Width不为0LOD物体烘培 SpeedTree 模式 二、反射探针1. 获取反射探针数据2. 环境光照明 IBL3. 反射探针&#xff08;Refl…

iOS自动打包如何用Python实现

在Python中实现iOS自动打包的过程需要使用第三方库和工具&#xff0c;如pyobjc和appdirs。以下是一个基本的Python脚本示例&#xff0c;用于自动打包iOS应用程序&#xff1a; python复制代码 import os import appdirs import subprocess import pyobjc # 获取应用程序目…

部署前后端分离项目详细教程

部署前后端分离项目详细教程 1、准备工作 首先你需要一台服务器&#xff0c;然后在服务器上安装好你所需要的环境&#xff0c;我这里用的宝塔界面来安装环境。 如果有人不知道怎么安装宝塔界面&#xff0c;可参考这篇文章&#xff0c;如果不知道怎么买服务器&#xff0c;可以参…

Python学习笔记——Collatz序列

Collatz序列&#xff0c;也称为3n1问题&#xff0c;遵循以下3个规则获得序列中的下一个数: 1、如果n是偶数&#xff0c;则下一个数 n n / 22、如果n是奇数&#xff0c;则下一个数 n n * 3 13、如果n为1&#xff0c;则停止计算&#xff1b;否则重复计算获取下一个数 从任意一…

golang网络编程day4

golang网络编程day4 get和post的区别resful编程golang请求头golangheader内容类型和字符编码http请求头缓存和过期应用golang 请求头跨域请求应用http请求头用户代理应用golang响应头 get和post的区别 在前面的学习我只在应用场景上做了一个区别的举例,这里是进一步的学习有哪…

菜鸡后端的前端学习记录-2

前言 记录一下看视频学习前端的的一些笔记&#xff0c;以前对Html、Js、CSS有一定的基础&#xff08;都认得&#xff0c;没用过&#xff09;&#xff0c;现在不想从头再来了&#xff0c;学学Vue框架&#xff0c;不定时更新&#xff0c;指不定什么时候就鸽了。。。。 忘了记一下…

前端工程化基础(四):Git代码版本控制工具详解

Git版本控制工具详解 认识版本控制&#xff08;版本控制&#xff09; 是维护 工程蓝图的标准做法&#xff0c;能追踪工程蓝图从诞生一直到定案的过程版本控制也是 一种软件工程技巧&#xff0c;借此能在软件开发的过程中&#xff0c;确保不同的人所编辑的同一程序都能得到同步…

MySQL的存储格式,MySQL的触发器

1&#xff0c;MySQL的存储格式 在MySQL中&#xff0c;创建存储函数使用create function关键字&#xff0c;其基本形式如下: create function func_name ( [param_name type[ ,...]]) returns type [characteristic ... ] begin routine_body end; 参数说明: (1) func_…

tcp/ip模型中,帧是第几层的数据单元?

在网络通信的世界中&#xff0c;TCP/IP模型以其高效和可靠性而著称。这个模型是现代互联网通信的基石&#xff0c;它定义了数据在网络中如何被传输和接收。其中&#xff0c;一个核心的概念是数据单元的层级&#xff0c;特别是“帧”在这个模型中的位置。今天&#xff0c;我们就…

密码输入检测

文章目录 题目描述输入描述输出描述示例一说明代码解释 题目描述 给定用户密码输入流 input&#xff0c;输入流中字符’<表示退格&#xff0c;可以清除前一个输入的字符&#xff0c;请你编写程序&#xff0c;输出最终得到的密码字符&#xff0c;并判断密码是否满足如下的密…

MySQL 处理JSON字符串

目录 前言 JSON值的部分更新 创建JSON值 JSON 值的规范化、合并和自动包装 合并JSON值 搜索和修改JSON值 JSON路径 JSON值的比较和排序 JSON值的聚合 前言 现在很多数据会以json格式存储&#xff0c;如果你还在用like查询json字符串&#xff0c;那你就OUT了&#xff0…

详解 Kruskal 算法的实现

一、算法原理 Kruskal 算法用于求最小生成树&#xff0c;它的主要思路是基于并查集&#xff0c;算法的主要原理如下&#xff1a; 假设图中有 n 个点&#xff0c;则&#xff1a; step 1&#xff1a;Kruskal 算法假定初始时每个点都只属于自己所在的并查集&#xff08;即初始时…

有趣的css - 简约的动态关注按钮

页面效果 此效果主要使用 css 伪选择器配合 css content 属性&#xff0c;以及 transition(过渡)属性来实现一个简约的动态按钮效果。 此效果可适用于关注按钮、详情按钮等&#xff0c;增强用户交互体验。 核心代码部分&#xff0c;简要说明了写法思路&#xff0c;看 css 部分的…

AUTOSAR内存篇 -Flash EEPROM Emulation(FEE)

文章目录 简介功能介绍通常行为寻址机制和分段地址计算擦除循环次数的限制“立即”数据的处理管理块正确性信息缓存对齐API介绍类型定义函数定义Fee_InitFee_ReadFee_WriteFee_CancelFee_GetStatus<

一文详解docker swarm

文章目录 1、简介1.1、涉及到哪些概念&#xff1f;1.2、需要注意什么&#xff1f; 2、集群管理2.1、创建集群2.2、将节点加入集群2.3、查看集群状态。2.4、将节点从集群中移除2.5、更新集群2.6、锁定/解锁集群 3、节点管理4、服务部署4.1、准备4.2、服务管理4.2.1、常用命令4.2…

[C++]继承(续)

一、基类和派生类对象赋值转换 在public继承时&#xff0c;父类和子类是一个“is - a”的关系。 子类对象赋值给父类对象/父类指针/父类引用&#xff0c;我们认为是天然的&#xff0c;中间不产生临时对象&#xff0c;也叫作父子类赋值兼容规则&#xff08;切割/切片&#xff…

idea查看日志的辅助插件 --- Grep Console (高亮、取消高亮)

&#x1f680; 分享一款很有用的插件&#xff1a;Grep Console &#x1f680; 我们在查看日志的时候可能会有遗漏&#xff0c;使用这款插件可以让特定的关键词高亮&#xff0c;可以达到不遗漏的效果&#xff01; 如果你是一个开发者或者对日志文件分析感兴趣&#xff0c;不要…

记录一次使用ant design 中 ConfigProvider来修改样式导致样式改变的问题(Tabs嵌套Tabs)

一 说明 继之前的一篇文章&#xff1a;antd5 Tabs 标签头的文本颜色和背景颜色修改 后&#xff0c;发现在被修改后的Tab中继续嵌套Tabs组件&#xff0c;这个新的Tabs组件样式跟外层Tabs样式也是一致的&#xff0c;如下图所示&#xff1a; 二 原因 在修改外层tabs样式时&…

Axios 和 Ajax 的区别

一、Axios 和 Ajax 的区别 1、Axios是一个基于Promise的HTTP库&#xff0c;而Ajax是对原生XHR的封装&#xff1b; 2、Ajax技术实现了局部数据的刷新&#xff0c;而Axios实现了对ajax的封装。 二、Axios 和 Ajax 的区别及优缺点 1、什么是Ajax Ajax是对原生XHR的封装&#xff0…