Shell编程之免交互

news/2025/2/7 19:57:08/文章来源:https://www.cnblogs.com/zsy828/p/18201262

目录
  • 1.Here Document免交互
  • 2.Here Document常规用法
    • (1)免交互执行命令
    • (2)免交互创建并编辑文件内容
    • (3)tee
  • 3.Expect免交互
  • 4.编写expect免交互脚本步骤
  • 5.read

1.Here Document免交互

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

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

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

2.Here Document常规用法

(1)免交互执行命令

交互式命令 <<EOF           #免交互执行命令
指定传入内容  
....
EOF

(1)通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,作为变量 i 的值

(2)免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给 wc -l 来统计

(3)通过 passwd 给用户设置密码

(2)免交互创建并编辑文件内容

默认情况下EOF中间的内容支持变量的替换;如果要关闭变量的替换,开头标记要用 '' 括起来,即 <<'EOF'
如果要抑制行首的制表符空白,开头标记前要加 - ,即 <<-EOF
如果要注释多行内容,可用 : <<EOF

cat > 文件 <<EOF          #免交互创建并编辑文件内容
指定文件内容
....
EOF

(1)支持变量替换
在写入文件时会先将变量替换成实际值,再结合 cat 命令完成写入

(2)整体赋值给变量,然后通过 echo 命令将变量值打印出来

(3)关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换

(4)去掉每行之前的 TAB 字符

(5)多行注释
Bash 的默认注释是“#”,该注释方法只支持单行注释;Here Document 的引入解决了多行注释的问题。
“:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。


(3)tee

将标准输入复制到每个指定文件,并显示到标准输出

tee 文件 <<EOF 
指定文件内容
....
EOF


3.Expect免交互

expect概述:
建立在tcl之上的一个工具
用于进行自动化控制和测试
解决shel脚本中交互相关的问题

expect安装:
yum install -y expect

4.编写expect免交互脚本步骤

(1)#先声明解释器
#!/usr/bin/expect(2)#接收位置参数传入
set 变量名 [lindex $argv 0]     #0代表执行脚本时后面跟的第一个位置参数,第二个位置参数用 1 表示,依此类推(3)#使用 spawn 指定交互命令 开启会话跟踪
spawn fdisk /dev/sdb(4)#使用 expect 捕获匹配交互命名的提示信息
expect "命令(输入 m 获取帮助):"(5)#再使用 send 发送需要交互输入的字符串,结尾需要加上回车符
send "n\r"
....#使用一个expect匹配多次:
#如果能匹配到情况1的提示信息则发送字符串1给交互进程,接着再用情况2匹配提示信息并发送字符串2给交互进程
#如果匹配不到情况1的提示信息则继续再用情况2匹配提示信息发送并字符串2给交互进程
expect {"情况1" {send "字符串1\r"; exp_continue;}"情况2" {send "字符串2\r"}}(6)#所有交互操作完成后,使用 expect eof(会返回原用户或者原终端界面)或 interact(会停留在切换的用户或者远程终端界面)结束交互会话(7)expect eof 
在shell脚本里嵌入expect免交互代码#!/bin/bash
....
expect << EOF
spawn 命令
expect "...."
send "...\r"
EOF

(1)切换用户免交互

(2)ssh远程登录免交互



(3)免交互修改用户密码


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

(2)exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。exp_continue 类似于控制语句中的 continue 语句。表示允许 expect 继续向下执行指令。
例如:下例将判断交互输出中是否存在 yes/no 或 *password。如果匹配 yes/no 则输出 yes 并再次执行判断;如果匹配 *password 则输出 abc123 并结束该段 expect 语句。
注意:使用exp_continue时,如果跟踪像 passwd 这样的输入密码后就结束进程的命令,expect{}外不要再加上expect eof
因为spawn进程结束后会默认向expect发送eof,会导致后面的 expect eof 执行报错
(3)send_user
send_user 表示回显命令,相当于 echo

5.read

read: 用法:read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]


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

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

相关文章

jupyter notebook无法找到自己的虚拟环境

1:打开cmd/Anaconda Prompt/Anaconda Powershell Prompt2:进入虚拟环境conda activate 环境名 3:conda list查看有无ipykernel包 如果没有,安装两个包:conda install nb_conda conda install ipykernel 如果下载不了将指令换成conda install nb_conda_kernels 注:conda/…

URLSearchParams:url查询处理工具

let params=new URLSearchParams(a=1&b=2&c=3#hash) 方法和属性: .get( ).has( )  //返回true/false .append(name,value)  //向URL中添加新的参数.set(name,value)  //设置指定参数的值,如果参数不存在则添加新参数 .delete(name)  //删除指定名称的参数 .k…

信息安全事件应急包好DVWA(finish)

​ *DVWA* *信息安全事件应急处理报告**皮包**公司* *20**24**年**5**月**20**日* ** ** 目 录 一、 概述 1.1 应急处理服务背景 1.2 应急处理服务目的 1.3 应急处理服务范围 1.4 应急处理服务依据 1.4.1 应急处理服务委托协议 1.4.2 基础标准与法律文件 1.4.3 参考文件…

P8624 [蓝桥杯 2015 省 AB] 垒骰子

原题链接 题解code #include<bits/stdc++.h> using namespace std; #define ll long long const ll mod=1e9+7; ll a[7][7]={0},e[7]={0};void cf1() {ll tem[7]={0};for(int i=1;i<=6;i++){for(int j=1;j<=6;j++){tem[i]+=a[i][j]*e[j];tem[i]%=mod;}}for(int i=1…

BLE+Compound复合设备

实现功能:BLE主从一体功能(centperi)添加USB复合设备(compound)。 思路:参考BLE_USB例程,该例程已经将BLE和模拟USB设备功能整合,并通过TMOS任务处理。将复合设备的报表替换BLE_USB的报表。 USB上传:

【Azure Storage Account】Azure 存储服务计算Blob的数量和大小的Python代码

问题描述 介绍一段Python脚本,可以在微软云中国区使用。 用于计算Azure Storage Account中Container中Blob类型文件的数量和大小,脚本中允许按照容器,层(热/冷/归档),前缀,软删除/非软删除来计算数量和容量大小, 默认使用的时间为以Blob的最后修改时间作为参考。 执行结果…

Scoket层

Scoket层 【一】Scoket层在哪【二】套接字工作流程一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。 等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。【0】服务端流程先从…

提升效率必备VSCode运行快捷键全攻略

哈喽,大家好,我是木头左!快捷启航:打开你的代码世界 在编程的世界里,时间就是金钱。了解并熟练使用Visual Studio Code(简称VSCode)的运行快捷键,可以大大节省你的时间,让你更加专注于代码逻辑和创意实现。本篇文章将为你揭示那些鲜为人知但异常强大的VSCode运行快捷键…

逆向 | 驱动挂靠进程直接读内存

逆向 | 驱动挂靠进程直接读内存参考:https://cloud.tencent.com/developer/article/2358904 https://github.com/Whitebird0/driver_read_and_write/blob/main/04-读写内存/ReadMemory.c 代码如下: 代码不长但是有坑,比如说ExAllocatePool2的参数就跟之前不一样了,这个点我…

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好,我是咸鱼。 最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。 今天就来简单入门一下 JWT。官方介绍:https://jwt.io/introduction 先聊聊 Token Token 的意思是令牌,通常用于身份…

CC2530 zigebee 实现低功耗

​ZigBee网络低功耗运行一直是苦逼攻城狮们要解决的问题,TI的CC2530可以说已经把终端的休眠功耗降低到了极致,现在我们就来体验这颗芯片的魅力!文章末尾分享完整源码和PCB工程文件。 一、CC2530供电模式 CC2530芯片有五种运行模式,分别为主动模式、空闲模式、PM1、PM2和PM3…

『手撕Vue-CLI』处理不同指令

前言 在上一篇『手撕Vue-CLI』添加自定义指令中,已经实现了自定义指令的添加,但是指令还是比较简单的,只是简单的打印一句话,那么在实际运用场景中,可能会有更多的需求,比如可能需要在指令中传递参数,或者需要在指令中进行一些复杂的操作,那么这个时候我们就需要对指令…