shell免交互

news2024/11/25 14:37:38

shell免交互

Here Document 免交互

使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个“文件”并用作“命令”的标准输入。Here Document 也可以与非交互式程序和命令一起使用。

语法格式:
命令  <<标记
...	
内容			#标记之间是传入内容
...
标记

注意事项

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

实验

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

在这里插入图片描述

  • 通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,作为变量 i 的值
read i <<EOF
>Hi
>EOF
echo $i

在这里插入图片描述

  • 通过 passwd 给用户设置密码
passwd lisi <<EOF
>abc1234 			#这两行是输入的密码和确认密码
>abc1234
>EOF

在这里插入图片描述

支持变量替换

  • 在写入文件时会先将变量替换成实际值,再结合 cat 命令完成写入
#!/bin/bash
file="123.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOF

cat 123.txt

在这里插入图片描述

在这里插入图片描述

  • 整体赋值给变量,然后通过 echo 命令将变量值打印出来
#!/bin/bash
var="helloworld"
myvar=$(cat <<EOF			 
This is Line 1
hello
$var
EOF
)
echo "$myvar"

在这里插入图片描述

在这里插入图片描述

关闭变量替换的功能

  • 关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换
  • 在通过一个脚本生成另一个脚本,另一个脚本涉及到变量的引用,此时使用‘’单引号,可以直接输出变量形式。不至于另一个脚本出错。或者在变量前面加上\取消$得特殊含义,即此处为\$var
#!/bin/bash
var="helloworld"
myvar=$(cat <<'EOF'			#对标记加单引号,即可关闭变量替换			 
hello
$var   #或者在这里添加上“\”即\$var
EOF
)
echo $myvar

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 去掉每行之前的 TAB 字符----不能忽略空格,只能忽略制表符
#!/bin/bash
var="helloworld"
cat <<-EOF
        hello
   $var
123   456
EOF

在这里插入图片描述

在这里插入图片描述

命令补充tee

tee file    #将标准输入覆盖写入到file中,同时在退出时再打印一遍
tee -a file   #同上,只不过是追加不是覆盖
tee - #输出到标准输出两次
tee - - #输出到标准输出三次
tee file1 file2 -  #输出到标准输出两次,并写到那两个文件中
 ls |  tee file  #命令标准输出保存至file
 ls "*" 2>&1 | tee ls.txt  #标准错误都被tee读取给ls

在这里插入图片描述

  • 如何在输出变量时保留换行符
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

多行注释

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Expect

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

  • 方法一
    rpm -q expect
    rpm -q tcl
  • 方法二
    yum install -y expect

基本命令:

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

#!/usr/bin/expect

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

例:spawn passwd root

(3)expect
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;
只能捕捉由spawn启动的进程的输出;
用于接收命令执行后的输出,然后和期望的字符串匹配
(4)send
向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r(回车)或者\n
例:
方式一:

expect "密码" {send "abc123\r"}		#同一行send部分要有{}

方式二:

expect "密码"	
send "abc123\r"							#换行send部分不需要有{}

方式三:
expect支持多个分支

expect	#只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
{
"密码1" {send "abc123\r"}
"密码2" {send "123456\r"}
"密码3" {send "123123\r"}
}

(5)结束符

  • expect eof
    表示交互结束,等待执行结束,退回到原用户,与spawn对应。
    比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户
  • interact
    执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
    使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。

注意:expect eof 与 interact 只能二选一。
(6)set
expect 默认的超时时间是 10 秒,通过 set 命令可以设置会话超时时间, 若不限制超时时间则应设置为-1。

例:set timeout 30

(7)exp_continue
exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。exp_continue 类似于控制语句中的 continue 语句。表示允许 expect 继续向下执行指令。
例如:下例将判断交互输出中是否存在 yes/no 或 *password。如果匹配 yes/no 则输出 yes 并再次执行判断;如果匹配 *password 则输出 abc123 并结束该段 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 执行报错
(8)send_user
send_user 表示回显命令,相当于 echo
(9)接收参数
expect 脚本可以接受从bash命令行传递的参数,使用[lindex $argv n]获得。其中n从0开始,分别表示第一个,第二个,第三个…参数。
例:

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

实验

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

  • su切换用户

在这里插入图片描述

嵌入执行模式,将 expect 过程融入 Shell 当中,方便执行和处理。像ssh、su这种会切换环境的交互式命令一般不建议使用嵌入执行模式。

创建用户并设置密码
在这里插入图片描述

实现 ssh 自动登录

在这里插入图片描述

使用expect实现fdisk /dev/sdb 免交互创建分区,要求一次性创建一个20G/dev/sdb1的普通分区和一个4G/dev/sdb的swap分区和一个逻辑分区10G /dev/sdb5

在这里插入图片描述

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

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

相关文章

Python 爬虫(四):Selenium 框架

Selenium 是一个用于测试 Web 应用程序的框架&#xff0c;该框架测试直接在浏览器中运行&#xff0c;就像真实用户操作一样。它支持多种平台&#xff1a;Windows、Linux、Mac&#xff0c;支持多种语言&#xff1a;Python、Perl、PHP、C# 等&#xff0c;支持多种浏览器&#xff…

Android中的IPC方式

Android中的IPC方式 1.Bundle 其中Intent就是用Bundle进行传播 四大组件间的进程间通信 2.使用文件共享 2.1文件共享的缺点 无并发&#xff0c;适用于交换简单的数据实时性不高的情景 使用文件共享容易出&#xff1a; 内容不一致&#xff1a;如果多个线程同时写入文件&…

【JavaWeb】-- Request和Response、JSP、会话技术

文章目录 Request和Response1.概述2.Request对象2.1 Request继承体系2.2Request获取请求数据2.3 IDEA创建Servlet2.4 请求参数中文乱码问题POST请求解决方案GET请求解决方案 2.5 Request请求转发 3.Response对象3.1 Response设置响应数据功能介绍3.2 Response请求重定向3.3 路径…

RabbitMQ养成记 (8. 消费者接受消息可靠性 consumer Ack)

Consumer Ack ack 指的是acknowledge 确认&#xff0c; 指的是消费端收到消息后的确认方式。 有三种确认方式&#xff1a; 自动确认手动确认 &#xff08;根据业务情况 手动确认是否成功发送&#xff09;根据异常情况确认 我们在消费端用代码实践一下&#xff1a; 首先我们定…

不会还有人不知道软件测试报告模板怎么写吧?

在测试岗位上&#xff0c;写报告是一项非常重要的软技能&#xff0c;写得好可以加分&#xff0c;写不好必然减分。 但在测试岗位上&#xff0c;提测“通过”和提测“不通过"的软件测试报告所包含的内容是不一样的&#xff08;这是个坑&#xff09;。但很多测试新人可能并…

LIO-SAM UBUNTU16.04.7 ROS-KINETIC 环境 编译 安装

简单记录一下 VMWARE workstation15UBUNTU16.04.7ros-kineticgtsam4.0.0 &#xff08;默认16.04比较老旧&#xff0c;不好用&#xff0c;vmtools也都没有&#xff0c;选了一个.7&#xff09; 选16.04版本的理由也简单&#xff0c;只是为了参考一个博客&#xff0c;单独建的环…

C语言-易错点汇总

易错点汇总 指针数组和数组指针(*p).astruct stdent和typedef struct stdentF5和CtrlF5const的位置全局变量和局部变量两个相同的常量字符串数组名和&数组名数组指针定义的解读int (*arr[10])[5]数组传参(* (void (*)())0)();关于数组名是否表示整个数组和数组首元素的地址…

Java位运算

Java >>和>>>的区别 | 或&#xff1a; 有1得1&#xff0c; 全0得0 int temp a|c;System.out.println(Integer.toBinaryString(a));System.out.println(Integer.toBinaryString(c));System.out.println(Integer.toBinaryString(temp));/*** 结果输出* * 01* …

对比SQL学Python:筛选|条件判断

SQL里筛选数据主要用到了where、and、in等语句。而在Python里实现筛选的方式比较多样&#xff0c;用到了 与&或|非~ 逻辑运算符&#xff0c;和isin()函数等。我们感受一下二者的区别吧&#xff1a; 汇总&#xff1a; 类型Python语句参考单条件筛选 data[data[shop_type]A…

Python复制目录及其子目录下的所有文件到指定新目录并重命名

Python复制目录及其子目录下的所有文件到指定新目录并重命名 前言前提条件相关介绍实验环境Python复制目录及其子目录下的所有文件到指定新目录并重命名代码实现输出结果 前言 本文是个人使用Python处理文件的电子笔记&#xff0c;由于水平有限&#xff0c;难免出现错漏&#x…

最常用的界线矢量数据大合集(文末有附下载方法)

最近收集了挺多比较常用的矢量界线数据&#xff0c;例如地理分区、气候分区等界线数据&#xff0c;在日常制图、学习、科研等方面使用频率比较高。废话不多说&#xff0c;这里给大家分享一下&#xff01;&#xff01; 1、中国农业熟制区划矢量数据 2、黄土高原空间范围矢量数据…

【Leetcode -509.斐波那契数 -520.检测大写字母】

Leetcode Leetcode - 509.斐波那契数Leetcode - 520.检测大写字母 Leetcode - 509.斐波那契数 题目&#xff1a;斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。 该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。…

node笔记_koa框架是什么?

文章目录 ⭐前言⭐ koa框架是如何发展而来的&#xff1f;⭐ koa框架的基本使用&#x1f496; 安装 koa&#x1f496; koa的Middleware示例&#x1f496; 支持xml ⭐ 结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文介绍node的一个web框架koa。 往期文章 node_window…

第三章: Mybatis-Plus 的通用CRUD API 练习使用

目录 1. Insert 操作 -> Create 1.1: TableId 的 id策略 1.2: TableField 2. Update 操作 -> Update 2.1: 根据 ID 更新 2.2: 根据条件更新 3. Delete 操作 -> Delete 3.1: deleteById 3.2: deleteByMap 3.3: delete 3.4: deleteBatchIds 4. Select 操作 -&g…

Redis修炼 (15. redis的持久化-RDB)

RDB 就是 redis database backup file 数据备份文件 就是把内存中的所有数据都保存在磁盘中。 save 注意这个保存过程是主进程在做 因为redis 是单线程 所有其他所有请求都会被卡死。 bgsave 这个稍微友好一点 是子进程 执行&#xff0c;避免主进程收到影响。 redis在服务停机…

【JavaWeb】-- Maven基础、MyBatis

文章目录 Maven基础1.Maven简介1.1 Maven模型1.2 仓库 2.Maven安装3.Maven基本使用3.1 Maven常用命令3.2 Maven生命周期 4.IDEA使用Maven4.1 IDEA配置Maven环境4.2 Maven坐标4.3 IDEA 创建Maven项目 5.依赖管理5.1 使用坐标引入jar包5.2 依赖范围 MyBatis1.MyBatis概述1.1JDBC的…

JDK、JRE和JVM三者的区别和联系

一、JDK、JRE、JVM分别是什么 &#xff08;一&#xff09;JDK JDK&#xff0c;全称Java Development Kit&#xff0c;是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心。 &#xff08;二&#xff09;JRE J…

Day970.数据库表解耦 -遗留系统现代化实战

数据库表解耦 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于数据库表解耦的内容。 微服务拆分之初&#xff0c;需要搭建好的两个基础设施&#xff0c;一个是基于开关的反向代理&#xff0c;另一个是数据同步机制。 有了这两个设施做保障&#xff0c;接下来就可以…

Python合并同名Labelme标注文件内容

Python合并同名Labelme标注文件内容 前言前提条件相关介绍实验环境Python合并同名Labelme标注文件内容Json文件代码实现输出结果json文件 前言 本文是个人使用Python处理文件的电子笔记&#xff0c;由于水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。 (https://b…

Sping核心知识点总结

Spring框架日渐成熟&#xff0c;已经成为java开发中比不可少的部分&#xff0c;框架这东西我的理解里属于工具型应用&#xff0c;意味着如果没有大量实践之前之间研究理论 研究源码之类的 体会会很效率会很低&#xff0c;所以个人建议萌新先找个项目做一做&#xff0c;感受一下…