22 Shell编程之免交互

目录

22.1 Here Document免交互

        22.1.1 Here Document概述

        22.1.2 Here Document免交互

        22.1.3 Here Document变量设定

        22.1.4 Here Document格式控制

        22.1.5 Here Document多行注释

22.2 expect免交互

        22.2.1 expect概述

        22.2.2 expect安装

        22.2.3 基本命令介绍

        22.2.4expect语法

        22..2.5 expect案例


22.1 Here Document免交互

        22.1.1 Here Document概述

        Here Document 是一个特殊用途的代码块。它在 Linux Shel 中使用 I/0 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。Here Document 是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。它的基本语法格式如下。

命令 <<EOF
...
...
...
EOF

        特殊字符“<<"在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的 stdin。标记的选择要确保不会出现在其他地方,避免出现混淆;两个标记之间的内容被当做是一个文件并用作“命令"的标准输入。另外 Here Document 也可以与非交互式程序和命令一起使用。 

        在使用过程中,有四点需要注意。

        1.标记可以使用任意的合法字符;

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

        3.结尾的标记后面也不能有任何字符(包括空格);

        4.开头的标记前后的空格会被省略掉。

        在 Linux 系统中使用 wc-命令后面直接跟文件名就可以统计文件内有多少行内容。采用 Here Document 免交互方式也可以实现对行数的统计。将要统计的内容置于标记“EOF之间,直接将内容传给wc-来统计,具体操作如下所示。

        22.1.2 Here Document免交互

        在编写 Shell 脚本时使用 Here Document 可以实现免交互,通过 Here Document 可以将一些简单的交互任务的交互过程去除掉,尤其是在编写脚本的过程中。

        1.通过read命令接收输并打印

        通常使用read 命令接收用户的输入值时会有交互过程,尤其是在脚本执行过程中遇到read 命令,脚本会停下来等待用户输入值后才会继续。

        2.通过passwd给用户设置密码

         通过 passwd 命令给jery 用户设置密码,为避免重复交互,可使用 Here Document的方式。EOF 标记之间的两行是输入的密码和确认密码,两行内容必须保持一致,否则密码设置不成功。此脚本执行后不会输出任何信息,可另开一个终端使用jerry用户登录,输入新修改的密码来验证密码是否修改正确。

        22.1.3 Here Document变量设定

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

        在上述执行的过程中,标记内变量i的值被替换成了“company”,最终输出到#doc_file内,其值为2019.txt。

        除了变量替换,还可以使用 Here Document 来进行变量的设定。Here Document 不光可以将标记内容传给命令来执行,还可以将整体赋值给一个变量,然后通过 echo 命令将变量值打印出来。 

        在上述操作过程中,$ivar 先进行了替换,之后再转向输出,交由cat 显示出来,其结果放置到$()中,最后得到上述结果。 

        22.1.4 Here Document格式控制

        Here Document 支持两种控制输出格式的类型:关闭变量替换的功能与去掉每行之前的 TAB 字符。下面通过示例的方式分别介绍其使用县体方法。

        (1)关闭变量替换的功能

        关闭变量替换的功能,就是希望按照字符原本的样子输出,不做任何修改或替换。

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

        本示例的标记内,每行都有一个 TAB 字符。在第一行的标记前面加”,这个表示要抑制各行首 TAB 的作用。 

        22.1.5 Here Document多行注释

        Bash 的默认注释是“#”,该注释方法只支持单行注释,在 Shel 脚本的工作中,"#”右侧的任何字符串,bash 都会将其忽略。Here Document 的引入解决了多行注释的问题,其语法格式如下。

:<<DO-NOTHING
第一行注释
第二行注释
......
DO-NOTHING

        上述语法结构中":"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。 

        下面脚本用于演示 Shel 中多行注释,“:"开头的 Here Document 标记内容不会被执行,在需要使用多行注释的时候可以采用此方法。

22.2 expect免交互

        22.2.1 expect概述

        expect 是建立在 tcl语言基础上的一个工具,它可以让一些需要交互的任务自动化地完成,相当于模拟了用户和命令行的交互操作。expect 是用来进行自动化控制和测试的工具。主要解决 shel 脚本中不可交互的问题。对于大规模的 Linux 运维很有帮助。

        在 Linux 运维和开发中,经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入 yes/no, password 等信息。为了模拟这种输入,可以使用 expect脚本。

        在实际的生产环境中,有一个常用的场景就是批量配置集群无密钥登录。如果集群的机器数量很多,手动一台一台地去每台机器去配置无密钥是非常糟糕的事情。使用 expect功能,可以远程登录机器,并通过交互方式进行无密钥登录。

        22.2.2 expect安装

        Linux 系统自身并没有安装 expect 和 tcl,需要手动安装。CentOS 7.3 光盘中默认包含expect 安装包,所以需要先挂载光盘,制作本地yum 仓库,然后通过 yum 安装 expect。安装过程中yum 会自动安装 expect 的依赖软件 tcl。具体安装步骤如下。

        (1)挂载光盘

        通过mount命令挂载光盘到本地的/media目录。

        (2)制作本地yum源

        进入/etc/yum.repos.d/目录,删除默认存在的所有仓库配置文件,新建文件,并命名为local.repo,其中后缀.repo是必须的。匹配值文件内容如下。

        编写完配置文件后,执行以下命令删除yum缓存并更新。

 

        (3)执行安装命令

         执行以下命令,通过yum安装expect软件。

        安装完成之后,通过rpm -qa检查一下是否安装成功。

 

        22.2.3 基本命令介绍
        (1)脚本解释器

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

        (2)expect/send

        expect命令用来判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉由spawn 启动的进程的输出。

        expect 接收命令执行后的输出,然后和期望字符串匹配,若匹配成功则执行相应的send 向进程发送字符串,用于模拟用户的输入。Send 发送的命令不能自动回车换行,一般要加r(回车)。其常见语法形式有以下三种。

        方式1:

        方式2:

        方式3:

        expect支持多个分支。

 

        上述语法结构中$case1 代表检测命令的输出结果,如果输出内容和$case1一致,通过send 命令模拟用户发送内容到终端。 

        (3)spawn

        spawn后面通常跟一个命令,表示开启一个会话、启动进程,并跟踪后续交互信息。其语法如下。

spawn Linux 执行命令

        例如,如果想要跟踪切换用户的交换信息,可以执行以下命令。

 

        (4)结束符

        1.expect eof :等待执行结束,若没有这一句,可能导致命令还没执行,脚本就结束了

        2.interact: 执行完成后保持交互状态,把控制权交给控制台,这时可以手动输入信息需要注意的是,expect eof 与 interact 只能二选一。

        (5)set

        expect 默认的超时时间是 10 秒,通过 set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1。例如执行以下命令即可将超时时间设置为30 秒。

        (6)exp_continue

        exp_continue 表示允许 expect 继续向下执行指令

        (7)send_user

        send_user 表示回显命令,相当于echo。

        (8)接收参数

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

        参数存在 argv 中,使用第一个参数如下:

        $argc 表示参数个数,判断语句如下:

         在上述脚本中,$argv0 是脚本名,但[lindex $argv 0]是第一个参数 param1, [lindex$argv 1]是第二个参数 param2,以此类推。send user 用来显示信息到父进程(一般为用户的 shell)的标准输出。

        22.2.4expect语法
        1.语法结构
        (1)单一分支语法

        单一分支用于简单的用户交互,当监控命令的标准输出满足expect 指定的字符串时,向标准输入发送 send 指定的字符串。具体用法如下所示。默认情况下,send 不会向标准输入发送回车键,所以需要通过\ 手动换行。

        (2)多分支模式语法

        多分支用于复杂的用户交互,一般情况下输出内容可能有多个,根据不同的输出内容分别向标准输入发送不同的内容。其语法格式如下所示,只要匹配了 aaa、bbb或ccc中的任何一个,就执行相应的 send 语句,然后退出该 expect 语句。

        除了上述的多分支结构之外,还有另外一种多分支结构,具体使用方法如下所示exp_continue 表示继续后面的匹配,假如配了 aaa,执行完 send 语句后还要继续向下匹配
bbb . 

        2.expect执行方式
        (1)直接执行

        通过 SSH方式登录远程服务器,需要输入用户名和密码,比较繁琐。如果服务器比较多,手动输入用户名和密码会耗费大量时间,expect命令可以实现自动登录远程服务器,并进入交互模式。

        (2)嵌入执行

        上面讲到的直接执行的方式需要 expect 命令去执行脚本,在编写 Shell 脚本的时候需要去调用 expect 脚本,使用不灵活。这种情况下,可以采用嵌入执行模式,将 expect 过程融入 Shell 当中,方便执行和处理。

        22..2.5 expect案例
        1.创建用户并设置密码

        正常情况下创建用户 jack 并密码为jack123 的交互过程如下所示。

        根据正常的交互过程,编写expect脚本如下所示。

        2.实现ssh自动登录

        ssh 登录过程根据不同的场景会出现多种交互形式,比较典型的交互场景如下所示。

        (1)首次登录

        (2)正常登录

         连接被拒绝,可能是 ssh 服务没启动,或者端口不对,或者防火墙限制。

        没有连接地址

        利用 expect,根据上述不同的场景,可编写脚本如下所示 

 

        3.利用expect完成FTP登录过程 

        正常FTP登录交互过程如下。

        编写expect脚本如下。

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

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

相关文章

ARM裸机:地址映射

S5PV210的地址映射详解 什么是地址映射&#xff1f; S5PV210属于ARM Cortex-A8架构&#xff0c;32位CPU&#xff0c;CPU设计时就有32根地址线&32根数据线。 32根地址线决定了CPU的地址空间为4G&#xff0c;那么这4G空间如何分配使用&#xff1f;这个问题就是内存映射问题。…

NAND闪存巨头铠侠(Kioxia)计划最迟于10月下旬通过首次公开募股IPO

据路透社于6月26日引用消息来源的报道&#xff0c;在半导体市场条件反弹及财务业绩迅速改善的背景下&#xff0c;NAND闪存巨头铠侠&#xff08;Kioxia&#xff09;正准备尽快提交初步申请&#xff0c;并计划最迟于10月下旬通过首次公开募股&#xff08;IPO&#xff09;在东京证…

9.二维数组的遍历和存储

二维数组的遍历和存储 二维数组的遍历 二维数组a[3][4],可分解为三个一维数组,其数组名分别为: 这三个一维数组都有4个元素,例如:一维数组a[0]的 元素为a[0][0],a[0][1],a[0][2],a[0][3]。所以遍历二维数组无非就是先取出二维数组中得一维数组, 然后再从一维数组中取出每个元…

Eclipse代码编辑器自主配色

1. 打开 Eclipse 的设置 - Java - Editor - Syntax Coloring 2. 自定义各种类型的颜色&#xff0c;例如&#xff1a; 1. Interface 勾选&#xff0c;设置为紫色 2. Class 勾选&#xff0c;设置为淡蓝色 3. Abstract classes 勾选&#xff0c;有自己默认的颜色 …

俯视LLM的灵魂:一文搞懂稀疏自动编码器

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

使用jupyter打开本地ipynb文件的方法

常用方法&#xff1a; 先启动jupyter&#xff0c;然后在打开的页面点击upload&#xff0c;选择想要打开的文件上传然后打开&#xff0c;但是这样其实是先复制了一份到jupyter中&#xff0c;然后打开运行。而我不想复制。 方法二 先打开项目文件所在文件夹&#xff0c;文件夹…

【Dison夏令营 Day 01】如何用Python写一个游戏“石头剪刀布”

欢迎你们踏入这个充满无限可能性的编程世界&#xff01;作为一名热爱Python的开发者&#xff0c;我深感编程的魅力&#xff0c;并希望与你们一同分享这份乐趣和激情。编程&#xff0c;不仅仅是一种技能&#xff0c;更是一种思维方式和解决问题的工具。在Python的世界里&#xf…

如何寻找强势货币和弱势货币?

外汇交易的独特之处在于&#xff0c;它融合了两种货币的价值&#xff0c;其中一种货币的价值通过另一种货币来体现。举例来说&#xff0c;USDJPY外汇反映了美元与日元之间的价值关系&#xff0c;而EURUSD则代表了欧元与美元的价值对比。 通过开仓操作&#xff0c;我们预测一种…

Linux学习第54天:Linux WIFI 驱动:蓝星互联

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 数字化、现代化的今天&#xff0c;随处的WIFI给与了大众极大的方便&#xff0c;也感受到了科技的力量。万物互联、无线互联越来越成为一个不可逆转的趋势。现在比较火…

四川赤橙宏海商务信息咨询有限公司抖音电商领航者

在数字化浪潮席卷全球的今天&#xff0c;电商行业无疑是其中最为活跃、最具潜力的领域之一。而在中国这片广袤的土地上&#xff0c;四川赤橙宏海商务信息咨询有限公司以其独特的视角和前瞻性的战略布局&#xff0c;成为了抖音电商服务领域的佼佼者。今天&#xff0c;就让我们一…

stm32学习笔记---TIM输入捕获(代码部分)输入捕获模式测频率/PWMI模式测频率占空比

目录 第一个代码&#xff1a;输入捕获模式测频率 调整频率 PWM.c PWM.h 输入捕获 IC.c 输入捕获初始化步骤 TIM.h库函数 TIM_ICInit TIM_PWMIConfig TIM_ICStructInit TIM_SelectInputTrigger TIM_SelectOutputTrigger TIM_SelectSlaveMode 单独配置四个通道的分…

聊一聊UDF/UDTF/UDAF是什么,开发要点及如何使用?

背景介绍 UDF来源于Hive&#xff0c;Hive可以允许用户编写自己定义的函数UDF&#xff0c;然后在查询中进行使用。星环Inceptor中的UDF开发规范与Hive相同&#xff0c;目前有3种UDF&#xff1a; A. UDF--以单个数据行为参数&#xff0c;输出单个数据行&#xff1b; UDF&#…

打破生态「孤岛」,Catizen将开启Telegram小游戏2.0时代?

Catizen&#xff1a;引领Telegram x TON生态的顶级猫咪链游 在区块链游戏领域&#xff0c;吸引玩家的首要因素往往是游戏的趣味性。然而&#xff0c;仅靠趣味性无法评估一个项目的长期价值和发展潜力。真正能在区块链游戏市场中取得长久成功的项目&#xff0c;无一例外都依靠扎…

【消息队列】RabbitMQ集群原理与搭建

目录 前言1、集群搭建1.1、安装RabbitMQ1.1.1、前置要求1.1.2、安装Erlang环境①创建yum库配置文件②加入配置内容③更新yum库④正式安装Erlang 1.1.3、安装RabbitMQ1.1.4、RabbitMQ基础配置1.1.5、收尾工作 1.2、克隆VMWare虚拟机1.2.1、目标1.2.2、克隆虚拟机1.2.3、给新机设…

智能充电桩网关,构建高效充电网络

近年来我国新能源汽车的增长速度出现明显的上升趋势&#xff0c;但是其充电桩的发展还比较缓慢。目前在充电桩系统设计期间仍存在一些问题&#xff0c;主要表现在充电设施短缺、充电难等问题&#xff0c;这些问题的发生均会在一定程度上限制新能源汽车的发展&#xff0c;这就需…

navicat Premium发布lite免费版本了

Navicat Premium发布lite免费版本了&#xff0c;下面是完整功能对比链接 Navicat Premium 功能列表 | Navicat 免费版本下载链接如下&#xff1a; Navicat | 免费下载 Navicat Premium Lite 开发功能完全够用&#xff0c;点赞。 dbeaver该如何应对。

振弦采集仪在大型工程安全监测中的应用探索

振弦采集仪在大型工程安全监测中的应用探索 振弦采集仪是一种用于监测结构振动和变形的设备&#xff0c;它通过采集振弦信号来分析结构的动态特性。在大型工程安全监测中&#xff0c;振弦采集仪具有重要的应用价值&#xff0c;可以帮助工程师和监测人员实时了解结构的状况&…

如何在线上快速定位bug(干货)

想必有许多人都想我刚进公司一样不会快速定位线上bug吧&#xff0c;不会快速定位bug会大大降低我们的开发效率&#xff0c;随之而来的就是工作质量下降、业绩下滑。 我总结了一些我常用的线上定位技巧&#xff0c;希望能帮助到大家&#xff01; 我这里以使用阿里云日志分析作…

Attention步骤

一个典型的Attention思想包括三部分&#xff1a;Qquery、Kkey、Vvalue。 Q是query&#xff0c;是输入的信息&#xff1b;key和value成组出现&#xff0c;通常是原始文本等已有的信息&#xff1b;通过计算Q与K之间的相关性a&#xff0c;得出不同的K对输出的重要程度&#xff1b;…

2021年12月电子学会青少年软件编程 中小学生Python编程等级考试三级真题解析(选择题)

2021年12月Python编程等级考试三级真题解析 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、小明在学习计算机时&#xff0c;学习到了一个十六进制数101,这个十六进制数对应的十进制数的数值是 A、65 B、66 C、256 D、257 答案&#xff…