多行重定向,expect,字符串处理,高级变量,脚本工具

news2025/1/24 8:38:53

一,多行重定向

(一)含义

使用I/O重定向的方式将命令列表提供给交互式程序

标准输入的一种替代品

Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准输入,Here Document 可以与非交互式程序和命令一起使用

(二)语法格式

语法格式

命令<<   标记

....

......

标记

命令支持cat   tee

注意事项

  1. 标记可以使用任意的合法字符(通用的字符是EOF)

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

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

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

     5.  单引号 变量双引号 —

(三)多行重定向使用

1,多行重定向  写入文件

会自动生成   1    的文件

2,多行重定向标准输出

就是不加文件名  直接输出到屏幕上

3,多行重定向作用到脚本

4,tee  

效果和cat   一致,但是不需要重定向了

二,expect

(一)定义

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

需要装 yum install -y expect

脚本解释器    #!/usr/bin/expect

(二)格式

expect [选项] [ -c cmds ]    [ [ -[f|b] ]      cmdfile ]     [ args ]

(三)语法

(四) expect中相关命令

1,脚本解释器

expect 脚本中首先引入文件,表明使用的事哪一种shell

#!/usr/bin/expect

2,spawn 启动新的进程(监控,捕捉)

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

例: spawn passwd root

3,expect 从进程接收字符串

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

用于接受命令执行后的输出,然后和期望的字符串匹配

4,send 用于向进程发送字符串

向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加 \r (回车) 或者\ n

5,exp_continue 匹配多个字符串在执行动作后加此命令

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

exp_continue附加于某个expect 判断选项之后,可以是该项被匹配后还能继续匹配expect 判断语句内的其他项。exp_continue类似于控制语句的continue语句。表示允许expect继续向下执行命令。

例如:

expect

{

"(yes/no)" {send "yes\r";exp_continue;}

"*password" {set timeout 300; send "abc123\r"}

}

注意:使用exp_continue时,如果跟踪像passwd这样输入密码后就结束进程的命令,expect {}外不要加上expect eof 因为spawn进程结束后悔默认向expect 发送eof,会导致后面的expect eof执行报错

6,结束符    interact 允许用户交互expect eof

expect eof

表示交互结束,等待执行结束,退回到原用户,与spawn对应

比如切换到root用户,expect 脚本默认的等待时间是10s,当执行王命令后,默认停留10s后,自动切回原用户.

interact

执行完成后保持交互状态, 把控制权交给控制台,会停留在目标终端而不是退回到原终端,这时候就可以手工操作了,interact后命令不再起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。

使用interact会保持在终端而不会退回原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一台服务器,会一直在目标服务器终端而不会切回原服务器。

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

7,set

设置变量

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

例子: set time out 30

8,send_user

表示回显命令与echo相同

9,接收参数(位置变量)

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

例子:

set hostname [lindex $argv 0] 相当于hostname=$1

set password [lindex $argv 1] 相当于passswd=$2

expect直接执行,需要expect命令去执行脚本

su切换用户

(五)expect  使用示例

1,捕捉屏幕上的输出 出现hi 发送指定内容

2,脚本里写   scp 连接时,免密登录

注意:

scp 远程拷贝

sftp 文件传输

ssh 远程连接

rsync 文件同步

这四个都用ssh协议

手搓脚本

运行脚本

去到 另一台机器

3,scp 一次 yes 都不打的方法

改客户端配置文件

4,expect eof      interact  区别

expect eof 会退回去

interact 不会退回去

5,切换用户脚本

先手搓一个脚本

运行脚本,加用户名和密码    两个位置参数

当我们且到 root  时     会捕捉搭配  ]#    就会发送  hello root

6,   ssh远程连接免密

把root@192.168.217.77   看做  $1   

123  密码  看做    $2

7, 免交互远程批量创建用户


#!/bin/bash
net=192.168.91
password=123123
iplist="
101
102
"

for i  in $iplist
do
ip=$net.$i

/usr/bin/expect <<EOF

spawn ssh root@$ip

expect {
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send "$password\r"}
}
expect "*]#" { send "useradd test\n" }
expect "*]#" { send "echo 123123 |passwd --stdin test\r" }
expect "*]#" { send "exit\r"   }
expect eof
EOF
done

三,字符串处理

(一)字符串切片

1,基于偏移量取字符

1.1  取字符串的长度

${#var}
#返回字符串变量var的字符的长度,一个汉字算一个字符

 例子:

[root@localhost ~]#str=abc123你好
#定义变量
[root@localhost ~]#echo ${#str}
#使用 字符公式取长度
8

1.2  跳过左边的字符

即 跳过前n 个字符 取后面m个字符

例子:跳过前两个 往后数三个

 1.3   取字符串右边的字符

例子:取后两个字符

1.4  掐头去尾

例子:跳过前3 跳过后面两个 掐头去尾

 1.5  取倒数的范围

例子:从倒数第3 到倒数第二

2,基于模式取子串

2.1 删左留右   懒惰模式

例子: 删 第一个: 左边的内容 留:右边的内容

2.2 删左留右   贪婪模式(匹配到最后一个

例子:

2.3删右留左   懒惰模式

例子:

2.4  删右留左   贪婪模式

例子:

(二)查找替换

1,规则

${var/pattern/substr}
${变量/搜索的字符串/修改的字符串}

#查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之

${var//pattern/substr}
#查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之

${var/#pattern/substr}
#查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
#  在 此处  #代表开头


${var/%pattern/substr}
#查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
# 在此处  % 代表结尾

2,例子

2.1   查找用户李四

此处可知  getent passwd lisi   等同于在 passwd文件中 过滤lisi

我们定义变量  ustat=getent passwd lisi

2.2  懒惰模式 把李四换成123

2.3 贪婪模式 把李四都 去掉

2.4   #只换开头

2.5 % 只换结尾

(三)大小写转换

1,规则

${var^^}
#把var中的所有小写字母转换为大写


${var,,}
#把var中的所有大写字母转换为小写

2,例子

^^ 换成大写

 

,, 换成小写

四,高级变量

(一)高级变量赋值

例子:

[root@localhost ~]#unset str;var=${str-lucky}
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#echo $var
lucky
[root@localhost ~]#str=" ";var=${str-lucky}
[root@localhost ~]#echo $var

[root@localhost ~]#str="1";var=${str-lucky}
[root@localhost ~]#echo $var
1

(二) 变量的间接引用

eval命令

eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描

[root@localhost ~]#n=10
[root@localhost ~]#echo {1..$n}
{1..10}

[root@localhost ~]#eval echo {1..$n}
1 2 3 4 5 6 7 8 9 10


[root@localhost ~]#i=a
[root@localhost ~]#j=1
[root@localhost ~]#$i$j=hello
bash: a1=hello: 未找到命令...
[root@localhost ~]#eval $i$j=hello
[root@localhost ~]#echo $a1
hello

五,其他脚本工具

(一) 创建临时文件mktemp

1,格式

mktemp [OPTION]... [TEMPLATE]
说明:TEMPLATE: filenameXXX,X至少要出现三个

2,常见选项

 -d #创建临时目录
-p DIR或--tmpdir=DIR   #指明临时文件所存放目录位置

3,例子

 

4,作用

实现垃圾箱分类

 

(二) 安装复制文件install

install 功能相当于cp,chmod,chown,chgrp ,mkdir 等相关工具的集合

1,格式

install [OPTION]... [-T] SOURCE DEST 单文件
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY... #创建空目录

2,选项

 -m MODE,默认755
-o OWNER
-g GROUP
-d DIRNAME 目录

3,例子

3.1  当复制用

3.2 生成目录

(三) 生成随机密码

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

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

相关文章

Unity类银河恶魔城学习记录7-6 P72 Bouncy sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Colle…

Github 2024-02-18 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-18统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5PowerShell项目1Rust项目1PHP项目1Jupyter Notebook项目1TypeScript项目1 Black&#xff1a;不妥…

力扣51. N 皇后(回溯)

Problem: 51. N 皇后 文章目录 题目描述思路解决方法复杂度Code 题目描述 思路 1.决策路径&#xff1a;board中小于row的那些行都已经成功放置了皇后&#xff1b; 2.选择列表&#xff1a;第row行的所有列都是放置皇后的选择&#xff08;则根据N皇后相互攻击的股则编写判断当前决…

JVM常见问题笔记分享

文章目录 1 JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;1.2 什么是程序计数器&#xff1f;1.3 你能给我详细的介绍Java堆吗?元空间(MetaSpace)介绍 1.4 什么是虚拟机栈1.5 堆和栈的区别1.6 能不能解释一下方法区&#xff1f;1.5.1 概述1.5.2 常量池1…

鸿蒙应用模型开发-更新SDK后报错解决

更新SDK后提示 “ohos.application.Ability”/“ohos.application.AbilityStage”等模块找不到或者无相关类型声明 问题现象 更新SDK后报错“Cannot find module ‘ohos.application.AbilityStage’ or its corresponding type declarations”&#xff0c;“Cannot find modu…

【springboot+vue项目(十五)】基于Oauth2的SSO单点登录(二)vue-element-admin框架改造整合Oauth2.0

Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架&#xff0c;提供了丰富的组件和功能&#xff0c;可以帮助开发者快速搭建现代化的后台管理系统。 一、基本知识 &#xff08;一&#xff09;Vue-element-admin 的主要文件和目录 vue-element-admin/ |…

裁员不可怕,可怕的是软件测试行业在发生巨变,而你却原地踏步

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Android Studio 的 Gradle Task 没有显示

问题 Android Studio 的 Gradle Task 没有显示 详细问题 笔者需要获取android应用MD5&#xff0c;一种方法是 但是笔者的Android Studio 的 Gradle Task 没有显示 解决方案 依次点击&#xff1a;File -> Settings -> Experimental -> 取消勾选 “Do not build …

轻松采集商品 全称免滑块 精准实时数据采集|全平台电商API接口

随着电子商务的快速发展&#xff0c;越来越多的商家和消费者选择在淘宝上进行交易。 淘宝商品详情API接口轻松采集淘宝上的商品信息&#xff0c;全程免滑块&#xff0c;实现精准实时数据采集。 一、采集商品信息 商品详情API接口采用先进的爬虫技术&#xff0c;能够快速准确…

Python学习路线图

防止忘记&#xff0c;温故知新 进阶路线

医学超声模式简介

B模式 B是英文单词“亮度”&#xff08;Brightness&#xff09;的第一个字母&#xff0c;因为被观察结构的回声或亮度取决于反射信号的强度&#xff0c;它用平面图形的形式来显示被探查组织的具体情况。检查时&#xff0c;首先将人体界面的反射信号转变为强弱不同的光点&#x…

Python实现时间序列分析使用LOESS(STL)模型进行季节性趋势分解(STL算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中&#xff0c;LOESS&#xff08;局部加权回归平滑&#xff09;和STL&#xff08;Seasona…

Python第十七章(面向对象总结)

一。面向对象三大特征 1.封装&#xff1a;将属性和方法写到类里面&#xff0c;且可以添加私有属性和方法 2.继承&#xff1a;子类默认继承父类的所有属性和方法&#xff0c;子类可以重写父类的属性和方法 3.多态&#xff1a;传入不同的对象&#xff0c;产生不同的结果 二。多…

用连续自然数之和来表达整数

文章目录 题目描述&#xff1a;用连续自然数之和来表达整数输入描述输出描述用例1说明用例2代码运行举例注意&#xff1a;1、sprintf 和 strcat区别2、qsort 题目描述&#xff1a;用连续自然数之和来表达整数 一个整数可以由连续的自然数之和来表示。 给定一个整数&#xff0c…

鸿蒙语言ArkTS(更好的生产力与性能)

ArkTS是鸿蒙生态的应用开发语言 ArkTS提供了声明式UI范式、状态管理支持等相应的能力&#xff0c;让开发者可以以更简洁、更自然的方式开发应用。 同时&#xff0c;它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;进一步通过规范强化静态检…

自动驾驶中的 DCU、MCU、MPU、SOC 和汽车电子架构

自动驾驶中的 DCU、MCU、MPU 1. 分布式电子电气架构2. 域集中电子电气架构架构2.1 通用硬件定义 3. 车辆集中电子电气架构4. ADAS/AD系统方案演变进程梳理4.1 L0-L2级别的ADAS方案4.2 L2以上级别的ADAS方案 5. MCU和MPU区别5.1 MCU和MPU的区别5.2 CPU与SoC的区别5.3 举个例子 R…

陶建国教授谈中西方文化的差异与交融

龙年到来&#xff0c;这个春节里&#xff0c;“龙”字的英文翻译引发关注&#xff0c;冲上了热搜&#xff0c;网友发现&#xff0c;“龙”不再翻译为“dragon”&#xff0c;而是龙字的谐音“loong”。原来&#xff0c;在西方人的眼里&#xff0c;龙是凶猛的怪兽&#xff0c;具有…

Spring 事务原理总结六

不知不觉&#xff0c;关于Spring事务的文章已经写了五篇了。老实讲我自己不断质疑过自己&#xff1a;现在写这些文章还有意义吗&#xff1f;当前的市场已经成什么样了&#xff0c;为什么还要固守这落后的技术&#xff1f;但是贝索斯一次接受访谈的回答&#xff0c;让我写下去的…

抖店退货率太高,2024年没办法继续做了?买家市场下只能这样做

我是王路飞。 之前接到一位粉丝朋友的私信&#xff0c;说是自己做抖店也有段时间了&#xff0c;但现在没之前好做了。 一方面是行业内卷&#xff0c;自己做的无货源模式&#xff0c;没什么优势&#xff0c;利润太低了&#xff1b; 另一方面就是现在抖店的退货问题太严重了&a…

.netcore免费开源大型多用户商城系统源码

随着电商的不断扩大与市场占有率&#xff0c;现在基本每个企业或商家都会搭建自己的线上商城&#xff0c;而其中的多用户商城系统&#xff0c;由于可以让不同行业的商家入驻&#xff0c;同时也可以开设多个店铺受到了众多企业或商家的青睐。最几年&#xff0c;随着.net core C#…