shell编程之免交互(shell脚本)

Here Document 免交互

Here Document 概述

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

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

特殊字符在“在实际使用过程中,有四点需要注意:

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

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

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

开头的标记前后的空格会被省略掉;

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

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

具体示例如下:

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

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

这个示例中的输入值是两个eof标记之间的部分,也就是hi,这将作为变量i的值,在最后echo打印变量i的值,其值为hi

        

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

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

Here Document变量设定

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

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

Here Document 格式控制

Here Document 支持两种控制输出的格式的类型:关闭变量替换的功能与去掉每行之前的TAB字符。

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

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

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

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

Here Document 多行注释

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

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

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

expect免交互

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

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

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

基本命令介绍

(1)脚本解释器

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

#!/usr/bin/expect

(2)expcet/send

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

expect接收命令执行后的输出,然后和期望字符串匹配,若匹配成功则执行相应的send向进程发送字符串,用于模拟用户的输入,send发送的命令不能自动回车换行,一般要加\r(回车)。

方法一:

expect "$case1" {send "$respond1\r"}

方法二:

expect "$case1"

send "response1\r"

方法三:

expect支持多个分支。

expect

{

“$case1” {send "$response1\r"}

“$case2” {send "$response2\r"}

“$case3” {send "$response3\r"}

}

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

(3)spawn

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

语法如下:

spawn linux执行命令

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

spawn su root

(4)结束符

expect eof ;等到执行结束,若没有这一句,可能导致命令还没执行,脚本就结束了。

interact;执行完成后保持交互状态,把控制权交给控制台,这时可以手动输入信息。

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

(5)set

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

例如执行以下命令即可将超时时间设置为30秒。

set timeout 30

(6)exp_continue

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

(7)send_user

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

(8)接收参数

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

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

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

expect语法:

1,语法结构

(1)单一分支语法

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

(2)多分支模式语法

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

expect

{

“aaa” {send “AAA\r}

“bbb” {send “BBB\r}

“ccc” {send “BBB\r}

}

除了上述的多分支结构之外,还有另外一种多分支结构,具体使用方法如下所示。

exp_continue表示继续后面的匹配,假如匹配了aaa,执行完send语句后还要继续向下匹配bbb。

2,expect执行方式

(1)直接执行

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

(2)嵌入执行

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

expect案例

1,创建用户并设置密码

正常情况下创建用户jack并把密码设置jack123的交互过程如下:

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

wangwu是$1的值,pwd123是$2的值。

2,实现ssh自动登录

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

首次登录:

正常登录:

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

没有连接地址:

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

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

正常的FTP登录交互过程如下所示:

编写的expect脚本如下:

服务器端要安装vsftpd服务,并关闭防火墙,内核安全机制。并开启vsftpd服务。

客户端要安装ftp服务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue项目打包优化

Vue项目打包优化 前言 在这篇文章我们讨论Vue项目打包优化&#xff0c;并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一&#xff1a;删除viser-vue viser-vue底层依赖antv/g2等库一并被删除&#xff0c;目前总体积为46.9M&am…

红酒邂逅时尚,品味生活的双重魅力,引领潮流新风尚

在繁华的都市中&#xff0c;红酒与时尚如同一对孪生姐妹&#xff0c;共同诠释着品味生活的双重魅力。红酒&#xff0c;那深邃的色泽中蕴藏着千年的历史与文化&#xff1b;时尚&#xff0c;那流转的光影中凝聚着时代的潮流与个性。当两者相遇&#xff0c;便碰撞出了特别的火花&a…

PMP培训,哪个机构的通过率高?

有很多培训机构供选择&#xff0c;但要找到适合自己的却很困难。特别是随着PMP参考教材的更新&#xff0c;考试难度增加了&#xff0c;仅靠自学很难与报班的同学竞争。那么在众多PMP培训机构中如何选择最适合自己的呢&#xff1f;有哪些机构是可信赖的呢&#xff1f;下面将介绍…

纯干货丨知乎广告投放流程和避坑攻略

精准有效的广告投放企业获客的关键&#xff0c;知乎作为中国最大的知识分享平台&#xff0c;拥有着高质量的用户群体和高度的用户粘性&#xff0c;为广告主提供了独一无二的品牌传播与产品推广平台。然而&#xff0c;如何在知乎上高效、精准地进行广告投放&#xff0c;避免不必…

【Proteus仿真】基于stm32的数码管时钟

【Proteus仿真】基于stm32的数码管时钟 Proteus仿真&#xff01;基于stm32的数码管时钟~_哔哩哔哩_bilibili ‍ 01原理图 ​​ 02功能描述 1.通过按键修改时间 2.数码管显示实时时间&#xff0c;时-分-秒-毫秒格式 03获取方式 https://docs.qq.com/sheet/DTExIc2dPUUJ…

【原创工具】孔夫子旧书网店铺图书采集工具1.0

目录 1 概述2 演示效果2.1 图文2.2视频3 核心逻辑3.1 导出数据4 附件下载5 使用方式1 概述 爬取孔夫子旧书网的店铺图书信息(条码、书名、售价、定价),支持导出和调速(默认速度5条/s)、支持识别该店铺最新上架图书和总计图书数量,采集结果和官网排序一致,可以对比测试 2…

error: RPC failed: HTTP 413 curl 22 The reguested URL returned error: 413

当你用sourcetree 提交代码 报错 RPC failed: HTTP 413 curl 22 The reguested URL returned error: 413 4731719459468_.pic.jpg 1、修改缓存区大小 git config --global http.postBuffer 524288000 2、如果是自己公司搭建的git &#xff0c;让人看看服务端有没有限制 3、尝试…

机器学习-数据预处理-聚类-回归-分类-单车数据集

机器学习-数据预处理-聚类-回归-分类-单车数据集 前言一、数据预处理1. 导入数据集2. 数据预处理3. 处理缺失值4. 生成特征用于后续进一步的分析 二、数据分布可视化1. 骑行时长分布2. 起始站和终点站分布可视化3. 高峰期与非高峰期骑行频次分布 三、聚类分析1. K-means聚类 四…

【绝对有用】yolo系列目标检测 核心技术点 汇总

YOLO (You Only Look Once) 是一种高效的目标检测算法&#xff0c;它以速度和精度著称。YOLO 的工作原理是将目标检测视为一个回归问题&#xff0c;直接从图像的像素空间预测目标的类别和位置。YOLO 目标检测头包括以下几个关键部分&#xff1a; 输入图像处理&#xff1a; YOLO…

原、反、补码之间的相互转换以及计算机硬件实现有符号数、无符号数、定点小数、定点整数的加减法运算

目录 原、反、补码之间的相互转换 无符号整数的加减运算 无符号整数的加法运算 无符号整数的减法运算 有符号整数的加减运算 有符号整数补码的加法运算 有符号整数补码的减法运算 定点小数的加减运算 定点小数补码的加法运算 定点小数补码的减法运算 定点小数VS定点整…

Advantest 93000测试机中CLOCK DOMAIN 详解

爱德万测试&#xff08;Advantest&#xff09;的V93000系列测试系统是一个高度模块化和可扩展的平台&#xff0c;专为复杂和高性能的半导体器件测试而设计&#xff0c;包括系统级芯片&#xff08;SoC&#xff09;、存储器、射频&#xff08;RF&#xff09;和混合信号器件等。在…

Apple Intelligence,我们能得到什么?(上)

苹果公司WWDC 2024发布会&#xff0c;苹果AI成为最吸睛的焦点。不过&#xff0c;苹果的AI不是大家口中的AI&#xff0c;而是苹果独有的概念&#xff1a;Apple Intelligence&#xff0c;苹果智能。 所谓Apple Intelligence&#xff0c;被定义为iPhone、iPad和Mac的个人智能系统…

Android U Settings 应用中 APN 菜单实现的代码逻辑

功能简介 MobileNetwork移动网络设置页面下有【接入点设置】(APN)。 问题:为什么Controller初始化找不到pref,然后报错。 Note:什么时候切换成Controller的呢?在Android T&U 上还没有更新成kt实现 ,但是已经有Controller的方案。 流程逻辑 1、界面“telephony_a…

Day35:2734. 执行字串操作后的字典序最小字符串

Leetcode 2734. 执行字串操作后的字典序最小字符串 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中&#xff0c;你可以完成以下行为&#xff1a; 选择 s 的任一非空子字符串&#xff0c;可能是整个字符串&#xff0c;接着将字符串中的每一个字符替换为英文字母表中的前…

摒弃反模式:使用Kotlin委托优化Android BaseActivity

摒弃反模式&#xff1a;使用Kotlin委托优化Android BaseActivity 在Android开发中&#xff0c;许多开发者习惯于创建名为“BaseActivity”或“BaseFragment”的基类&#xff0c;以便在所有Activity或Fragment中共享一些通用行为。这种方法乍一看似乎是个好主意&#xff0c;但实…

SecureCRT使用SSH登录服务器报错:Key exchange failed

SecureCRT使用SSH登录Ubuntu服务器报错&#xff1a;Key exchange failed 原因&#xff1a; ssh客户端与服务器的公钥协商失败&#xff0c;SecureCRT客户端所指定的秘钥交换算法&#xff08;KexAlgorithms &#xff09;&#xff0c;不在服务端支持范围内。可能是服务端的sshd版…

预警与校准并行:可燃气体报警器在矿区井下甲烷泄露防控中的应用

在矿区井下作业中&#xff0c;甲烷泄露是一个严重威胁工人生命安全和矿区生产安全的隐患。因此&#xff0c;及时、准确地预警甲烷泄露并采取相应的处理措施显得尤为重要。 可燃气体报警器作为一种有效的监测工具&#xff0c;在预防甲烷泄露事故中发挥着不可替代的作用。 在这…

Linux通过expect实现免交互

免交互 Here Document 用于将多行字符串直接传递给命令的方式&#xff0c;不需要人为交互命令界面&#xff0c;实现免交互 当使用Here Document操作文件时&#xff0c;需要借助一个文件结束符 EOF&#xff1a;文件结束符 示例 在脚本文件中写入以下内容 <<&#x…

5. PyTorch+NCCL源码编译

系列文章 第1章 多机多卡运行nccl-tests 和channel获取第2章 多机多卡nccl-tests 对比分析第3章 使用tcpdump抓取rdma数据包第5章 PyTorchNCCL源码编译 目录 系列文章前言一、本地环境二、安装cudnn三、使用pytorch自带NCCL库进行编译安装1. 源码编译2. 查看版本和all_reduce测…

Nature推荐的三种ChatGPT论文写作指令(含PDF下载)

1. 润色学术论文 ChatGPT学术润色指令&#xff1a; “I’m writing a paper on [topic]for a leading [discipline] academic journal. WhatItried to say in the following section is [specific point]. Please rephrase itfor clarity, coherence and conciseness, ensuri…