Linux的免交互

news2024/11/25 4:42:23

交互:我们发出指令控制程序的运行,程序在接收到指令之后按照指令的效果做出对应的反应。

免交互:间接的通过第三方的方式把指令传送给程序,不用直接的下达指令。

1、here document免交互

ere document免交互:是命令行格式,也可以写在脚本当中,通过I/O重定向的方式将命令的列表传送给交互式程序或者命令

是标准输入的一种替代品,代替了人工的输入方式

语法格式:

命令(linux的系统命令)<<标记

内容1

内容2

内容3

标记

#wc 统计字符串
[root@localhost /]# wc -l << xy102
> 123
> 456
> 789
> xy102
3

注意事项:

1、标记可以是任意的合法字符(一般不用特殊字符,不以数字开头,通常以EOF作为默认的标记位)

2、结尾的标记位一定要顶格写,且前面不能有任何字符,空格也不行。

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

4、开头的标记前后的空格都会被省略掉

#使用免交互修改用户密码
[root@localhost /]# passwd dn <<EOF
> 123
> 123
> EOF
#使用免交互赋值
[root@localhost /]# read i << EOF
123
EOF
[root@localhost /]# echo $i
123

2、tee命令免交互

[root@localhost opt]# tee jh1.txt <<EOF
> 1
> 2
> 3
> EOF
1
2
3

3、引入变量

创建mjh1.sh脚本写入以下内容
[root@localhost opt]# cat mjh1.sh 
#!/bin/bash
file="test9.sh"
i=school
cat > $file <<EOF
I am going to $i
EOF

运行脚本生成test9.sh脚本文件
查看test9.sh脚本内容 

 

4、 整体变量赋值

将var字符串内容整体赋值给myvar
#!/bin/bash
var="good I am going to school"
#整体赋值方式
myvar=$(
cat <<EOF
zhangsan say
$var
EOF
)
echo  $myvar

输出结果
[root@localhost opt]# sh mjh1.sh 
zhangsan say good I am going to school

将EOF加单引号,关闭整体变量赋值
#!/bin/bash
var="good I am going to school"
myvar=$(
cat <<'EOF'
zhangsan say
$var
EOF
)
echo  $myvar
输出结果
[root@localhost opt]# sh mjh1.sh 
zhangsan say $var

5、Expect实现免交互

用tcl语言写的一个工具,主要用自动化控制和测试。解决shell脚本交互的问题

需要先下载

[root@localhost opt]# yum -y install expect

实例

#!/usr/bin/expect
#声明解释器,不再是默认的bash,需要声明,使用whereis expect 查找目录位置
set timeout 5
#set 设置,timeout 超时时间,expect有一个默认的超时时间10秒,设置超时时间5秒
#set也可以作为设置变量
spawn passwd dn
#spawn用来声明需要执行的命令,开启会话过程,并且跟踪后续的交互信息
expect "新的 密码:"
#expect来捕获需要执行的命令行
#捕获不需要完整的可以使用*代表所有
send "zlm12388\r"
#send 表示输入指令代码,\r表示回车
expect "重新输入新的 密码:"
send "zlm12388\r"

expect eof
#交互指令结束之后,会退回原用户,切换回之前的用户
#interact
#留在当前用户,不会改变

#最后一定要有结束语,以上两个只能选一个

 执行脚本要先赋权,使用./的方式执行  

实例:普通用户进行切换 

#!/usr/bin/expect
set timeout 5
set username [lindex $argv 0]
set password [lindex $argv 1]
#位置变量

#开始追踪
spawn su - $username
#免交互开始执行
expect "密码"
send "$password\r"
#继续捕获
expect "~]$"
send_user "ok"
#send_user =echo 打印指定内容
#结束语
interact

 实现效果

结束语使用 expect eof效果

6、 嵌入执行模式

嵌入执行模式,在shell当中加入expect,涉及到环境切换的场景不建议使用嵌套

例如ssh su 不适用使用嵌入模式

#!/bin/bash
user=$1
password=$2
#非交互命令,使用的是shell
useradd $user
#嵌入免交互
/usr/bin/expect <<-EOF
spawn passwd $user
expect "新的*"
send "$password\r"
expect "重新*"
send "$password\r"
expect eof
EOF

 实现效果

7、使用ssh连接其他主机  

基础版

#!/usr/bin/expect
set ip 192.168.10.30
set user root
set password 123
set timeout 5

#进入命令行
spawn ssh $user@$ip
expect {

"(yes/no)" {send "yes\r";exp_continue}
#这里捕获两次,表示该项被匹配之后,继续匹配其他的指定的内容
#类似于循环的continue,允许expect语句继续向下执行
"password" {send "$password\r"}
}
interact

实验效果

进阶版

#!/usr/bin/expect
set timeout 5
#使用位置变量,手动输入
set hostname [lindex $argv 0]
set password [lindex $argv 1]

#进入命令行
spawn ssh $hostname
expect {
#出现异常情况显示实现
"NO route to host" {send_user "主机名/ip有误\n"}
"Connection refusedi" {send_user "ssh连接拒绝\n"}
"(yes/no)" {send "yes\r";exp_continue}
"password" {send "$password\r"}
}
interact

8、小练习

免交互实现硬盘分区,分一个区即可,分完之后,第一步要格式,第二步实现挂载,挂载(手动挂载)然后在这个分区的挂载文件创建一个文件,写入内容“学习真好”,并且打印出结果,在一个脚本里完成,嵌入模式。

#!/bin/bash
# 使用shell
scan
# 列出所有块设备
lsblk
set timeout 5
# 设置超时时间为5秒
/usr/bin/expect <<-EOF
spawn fdisk /dev/sdb
#进行分区
expect  "命令" 
send "n\r"
expect  "(default p)"
send "p\r"
expect  "分区号" 
send "1\r"
expect  "起始 扇区 " 
send "\r"
expect  "Last" 
send "\r"
expect  "(输入 m 获取帮助)" 
send "w\r"

expect eof
EOF
# 刷新分区表
partprobe /dev/sdb
# 列出所有块设备以检查新分区 以及过滤想要出现的分区
lsblk | grep sdb1 >& /dev/null
if [[ $? -eq 0 ]]
then
echo "分区被建立"
mkfs.xfs -f /dev/sdb1
mkdir /data1
mount /dev/sdb1 /data1
df -hT
else
echo "分区没有被建立"
fi
#写入内容
cat >/data1/test1.txt <<EOF
学习真好
EOF
cat /data1/test1.txt

输出效果

 

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

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

相关文章

Studying-代码随想录训练营day20| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

第二十天&#xff0c;二叉树part07&#xff0c;二叉树搜索树加油加油&#x1f4aa; 目录 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 拓展&#xff1a;普通二叉树的删除方式 总结 235.二叉搜索树的最近公共祖先 文档讲解&…

在FlowUs息流,让知识库为你所用|如何打造个人知识库|如何打造企业知识库

&#x1f389; 在 FlowUs 的世界中&#xff0c;知识绽放出无限的可能&#xff01;&#x1f680; 在当今信息爆炸的时代&#xff0c;知识的更新换代速度极快&#xff0c;我们每天都面临着海量的信息冲击。拥有一个属于自己的知识库变得至关重要。 首先&#xff0c;打造自己的知…

Linux_应用篇(27) CMake 入门与进阶

在前面章节内容中&#xff0c;我们编写了很多示例程序&#xff0c;但这些示例程序都只有一个.c 源文件&#xff0c;非常简单。 所以&#xff0c;编译这些示例代码其实都非常简单&#xff0c;直接使用 GCC 编译器编译即可&#xff0c;连 Makefile 都不需要。但是&#xff0c;在实…

解决IMX6ULL GPIO扩展板PWM7/8中的pwm0/period后卡死问题

前言 本篇文章主要是记录解决百问网论坛上面设置 IMX6ULL GPIO扩展板PWM7/8中的pwm0/period后卡死问题&#xff0c;如下图&#xff1a; 一、查看原理图&#xff0c;找出对应引脚 在这里我们如何确定哪个扩展口中的引脚输出PWM波呢&#xff1f;我们可以通过查看原理图。 查看…

【Java】解决Java报错:IllegalMonitorStateException in Synchronization

文章目录 引言一、IllegalMonitorStateException的定义与概述1. 什么是IllegalMonitorStateException&#xff1f;2. IllegalMonitorStateException的常见触发场景3. 示例代码 二、解决方案1. 确保在同步代码块或方法中调用wait()、notify()和notifyAll()2. 使用同步方法3. 使用…

办公人导航-上网导航,找网站,下软件,找资源!

办公人导航是一个专门为办公人员设计的实用导航网站&#xff0c;旨在帮助用户高效地找到各种优质的办公资源和工具。无论是需要查找办公软件、学习资源还是娱乐工具&#xff0c;在办公人导航上都能找到你需要的内容。 办公人导航-实用的办公生活导航网站&#xff01;https://ww…

Linux内核测试技术

Linux 内核是Linux操作系统的核心部分&#xff0c;负责管理硬件资源和提供系统调用接口。随着 Linux 内核的不断发展和更新&#xff0c;其复杂性和代码规模也在不断增加。因此&#xff0c;确保内核的稳定性和可靠性变得尤为重要。内核测试技术是实现这一目标的关键手段。本文将…

Java使用Graphics2D画图,画圆,矩形,透明度等实现

背景 如上图,需要使用Java生成一个图片, 并以base64编码的形式返回给前端展示。 使用Graphics2D类,来进行画图,其中需要画方框、原型、插入图标、写入文字等,同时需要设置透明度等细节点 环境:Jdk17,springboot2.7.13 代码如下 有详细的注释 package com.demo;import c…

白帽子的海外第一单,750刀

国际惯例&#xff0c;给兄弟们看图 这是我们师傅挖国外SRC的部分赏金截图 就问你&#xff01;挖国外漏洞赚美金香不香&#xff01; 现在国内SRC越来越卷了&#xff0c;越来越多的白帽子开始挖海外漏洞赚美金。海外SRC真的比国内赏金高很多&#xff0c;不说高危漏洞&#xff0…

自编码器笔记

编码器解码器自编码器 先压缩特征&#xff0c;再通过特征还原。 判断还原的和原来的是否相等 encode data 在一个“潜在空间”里。它的用途是“深度学习”的核心-学习数据的特征并简化数据表示形式以寻找模式。 变分自编码器&#xff1a; 1. 首先、假设输入数据是符合正态分布…

《mnist_model.h5》在flask中加载mnist模型

一、在tensorflow中新建及保存模型 启动Jupyter Notebook 新建Notebook 代码 from flask import Flask, request, jsonify # type: ignore import numpy as np # type: ignore import tensorflow as tf # type: ignore import json from PIL import Image # type: i…

bigtop gradle 任务依赖关系

./gradlew deb 会编译ubuntu的所有deb包 任务deb会依赖17个任务&#xff0c;它们会按字母排序执行&#xff0c;如下&#xff1a; alluxio-deb bigtop-groovy-deb bigtop-jsvc-deb bigtop-utils-deb flink-deb hadoop-deb hbase-deb hive-deb kafka-deb livy-deb phoenix-deb …

React 19 新特性集合

前言&#xff1a;https://juejin.cn/post/7337207433868197915 新 React 版本信息 伴随 React v19 Beta 的发布&#xff0c;React v18.3 也一并发布。 React v18.3相比最后一个 React v18 的版本 v18.2 &#xff0c;v18.3 添加了一些警告提示&#xff0c;便于尽早发现问题&a…

51单片机STC89C52RC——8.1 8*8 LED点阵模块(点亮一个LED)

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;8*8 LED点阵模块 2.1 电路图 2.1.1 8*8 点阵模块电路图 2.1.2 74HC595&#xff08;串转并&#xff09;模块 电路图 2.1.3 芯片引脚 2.2 引脚电平分析 2.3 74HC595 串转并模块 2.3.1 装弹&#xff08;移位…

强化学习专题:强化学习知识梳理(一)

2024/6/23&#xff1a; 前段时间有幸完成了大学期间的第一篇论文。在面试之前复盘一下关于自己论文中DQN的一些相关点。 浅谈主要区别&#xff08;在线 or 离线&#xff09; 首先&#xff0c;一切的开始是强化学习中时序差分方程&#xff0c;这体现了强化学习方法的优化策略。在…

【MySQL进阶之路 | 高级篇】MySQL8.0索引新特性->降序索引与隐藏索引

1. 支持降序索引 降序索引以降序存储键值.虽然在语法上&#xff0c;从MySQL4版本已经支持降序索引的语法了&#xff0c;但实际上该DESC定义是被忽略的.知道MySQL8.x版本才开始真正支持降序索引.(仅限于InnoDB存储引擎). MySQL在8.0版本前创建的仍然是升序索引&#xff0c;使用…

PADS系列:如何导入元件库新建元件

对于普通的原理图&#xff0c;位置的摆放是比较随意的&#xff0c;并且也没有一些特殊的或者元件库里面没有的元件&#xff0c;相对来说绘制会比较简单。但是如果碰上复杂一点的电路&#xff0c;要绘制起来就会比较麻烦&#xff0c;需要一些新的PADS使用技巧&#xff0c;最基础…

云计算考试题

Cloud ❀ 云计算-虚拟化常见的两种架构_裸金属架构和宿主型架构的区别-CSDN博客 为啥要成2 11 bcd 16 acd abcd BCD NAS为啥支持文件存储的协议 选BCD 什么是网络文件系统 选bcd 错题 选abc 选bcd 选 abd

NetSuite Account Merge 科目合并功能分析

最近项目中&#xff0c;客户有提到过能否将不用的Account与新建的Account进行合并&#xff0c;即我们所说的Merge功能&#xff5e;可以&#xff0c;但是该功能有使用的限制&#xff0c;比如最直接的一点需要注意&#xff0c;不同类型的Account是不可以使用Merge功能的&#xff…

c++内存管理_复习

new与placement new new&#xff1a; 先调用operator new(大小)&#xff0c;而operator new()会调用malloc尝试分配内存&#xff0c;失败则调用_callnewh()来释放内存&#xff0c;直至分配成功 可以设置分配失败的处理函数&#xff1a;将写好的处理函数作为参数传入set_new_han…