38、shell之免交互

news2024/10/5 9:39:01

免交互

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

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

一、Here Document 免交互:

这是命令行格式,也可以写在脚本当中。通过i/o重定向的方式将命令的列表传送给交互式程序或目命令。

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

1.1、语法格式:

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

内容1

内容2

内容3

标记

[root@test1 opt]# wc -l <<xy102

> 123
> 234
> 456
> xy102
> 3
[root@test1 ~]# wc -l <<xy

> 1
> 2
> 3
> 4
> 5
> xy
> 5

1.2、注意事项:

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

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

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

1.3、免交互之重定向:

[root@test1 opt]# read i <<EOF
TES
EOF

[root@test1 opt]# echo $i
TES
[root@test1 opt]# passwd ly <<EOF

> 123
> 123
> EOF
> 更改用户 ly 的密码 。
> 新的 密码:无效的密码: 密码少于 8 个字符
> 重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
[root@test1 opt]# cat <<EOF>>test3.txt  #>>追加

> 123
> abc
> ABC
> EOF
> [root@test1 opt]# cat test3.txt
> 1 www.kgc.com
> 2 mail.kgc.com
> 3 ftp.kgc.com
> 4 linux.kgc.com
> 5 blog.kgc.co
> 123
> abc
> ABC
[root@test1 opt]# tee test3.txt <<EOF  #<<覆盖
> 456
> 654
> EOF
> 456
> 654
> [root@test1 opt]# cat test3.txt
> 456
> 654

1.3、cat > $a <<EOF以及cat <<EOF引入变量值

file="test4.sh"
i=school
cat > $file <<EOF   #变量值引入file--test4.sh
I am going to $i
EOF

[root@test1 opt]# cat > test   ##在此基础上进行重定向输入到文件中;
asasa
sad
asd
asd
fss
[root@test1 opt]# cat > test <<EOF
> 123
> 234
> EOF

在这里插入图片描述

[root@test1 opt]# cat <<EOF

> 123
> 1234
> 345
> 2314
> EOF
> 123
> 1234
> 345
> 2314
##相当于cat一个文件,文件里面包含这些内容。免交互形式的写入内容
[root@test1 opt]# vim test3.sh

#整体变量赋值
var="Great! i am going to sschool"
myvar=$(cat <<EOF
THIS is monday
$var   ##=Great! i am going to sschool
EOF
)
echo $myvar

[root@test1 opt]# sh test3.sh
THIS is monday Great! i am going to sschool

关闭EOF后,EOF内部变量失效变成字符串。

[root@test1 opt]# vim test3.sh

var="Great! i am going to sschool"
myvar=$(cat <<'EOF'
THIS is monday
$var
EOF
)
echo $myvar



[root@test1 opt]# sh test3.sh
THIS is monday $var

[root@test1 opt]# cat <<'EOF'     
THIS is monday
$var
EOF

THIS is monday
$var
[root@test1 opt]# cat <<EOF##相当于cat一个文件,文件里面包含这些内容。
THIS is monday
$var
EOF
THIS is monday

二、Expect实现免交互

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

转义符:

\n:换行

\r:回车

\t:相当于tab键

\b:表示退格,删除

需要安装软件

2.1、Expect免交互实现用户密码更改

[root@test1 opt]# vim passwd

#!/usr/bin/expect
#声明解释器,不再是默认的bash。需要声明
#set设置,timeout超时时间,expect有默认超时时间是10秒,设置超时时间5秒。
#set也可以作为设置变量
spawn passwd ly
#spawn 后面用来声明需要执行的命令,开启会话过程,并且跟踪后续的交互信息。

expect "新的*"
#捕获需要执行的命令行,只要能捕获就行,不需要完整的,可以*代表所有

send "123\r"
#输入指令代码
expect "重新输入新的 密码:"

send "123\r"

#最后一定要有结束语,结束语只能写一个
expect eof
#交互指令结束之后,会退回原用户,5秒之后切换回原用户
#interact
#留在当前用户,不会动


[root@test1 opt]# chmod 777 passwd
[root@test1 opt]# ./passwd
spawn passwd ly
更改用户 ly 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@test1 opt]# 

2.2、expect位置传参-----interact留在当前用户

#!/usr/bin/expect
#声明解释器,不再是默认的bash。需要声明
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

结果
[liyang@test1 ~]$ ./test1.sh ly 123
spawn su - ly
密码:
上一次登录:三 6月 26 00:55:13 CST 2024pts/3 上
[ly@test1 ~]$ ok

expect eof留在当前用户

#!/usr/bin/expect
#声明解释器,不再是默认的bash。需要声明
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



结果:

[root@test1 opt]# ./passwd ly
spawn su - ly
上一次登录:二 6月 25 11:19:38 CST 2024pts/3 上
[ly@test1 ~]$ 
[ly@test1 ~]$ ok[root@test1 opt]# 
[liyang@test1 ~]$ ./test1.sh ly 123
spawn su - ly
密码:
上一次登录:三 6月 26 00:47:40 CST 2024pts/2 上
[ly@test1 ~]$ ok[liyang@test1 ~]$ 

三、嵌入模式

3.1、/bin/bash嵌入模式

#嵌入执行模式,在shell当中加入expect,涉及到环境切换的场景不建议使用嵌套。
#ssh su不适合使用嵌入模式
#!/bin/bash
user=$1
password=$2
#非交互指令,使用的是shell
useradd $user
#嵌入免交互
/usr/bin/expect <<-EOF
spawn password $user
expect "新的*"
send "$password\r"
expect "重新*"
send "$password\r"
expect eof
EOF


[root@test1 opt]# ./qiantao zq 123
spawn passwd zq
更改用户 zq 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

3.2、expect脚本内参数赋值

[root@test1 opt]# vim ssh.sh

#!/usr/bin/expect
set ip 192.168.168.20   #相当于内部写入参数的值,spawn命令执行,直接使用。
set user root    ##此处规定了用户和密码
set password 123
set timeout 5
#进入命令行:
spawn ssh $user@$ip

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

[root@test1 opt]# chmod 777 ssh.sh
[root@test1 opt]# ./ssh.sh
spawn ssh root@192.168.168.20
The authenticity of host '192.168.168.20 (192.168.168.20)' can't be established.
ECDSA key fingerprint is SHA256:yaufdRU2oi//z+PpV7wdWdPdTdEZT2SrypnKy30CsdY.
ECDSA key fingerprint is MD5:85:b0:7c:f3:f0:3a:95:f0:25:19:47:f4:90:46:bc:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.168.20' (ECDSA) to the list of known hosts.
root@192.168.168.20's password: 
Last login: Tue Jun 25 13:47:39 2024 from 192.168.168.11
[root@localhost ~]# 

[root@test1 opt]# vim ssh.sh
[root@test1 opt]# ./ssh.sh
spawn ssh root@192.168.168.20
root@192.168.168.20's password: 
Last login: Tue Jun 25 13:57:00 2024 from 192.168.168.10

3.3、expect脚本外部传参

#!/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 refused" {send_user "ssh连接拒绝\n"}
        "(yes/no)" {send "yes\r";exp_continue}
        "password" {send "$password\r"}
}
interact



[root@test1 opt]# ./ssh1.sh root@192.168.168.20
spawn ssh root@192.168.168.20
root@192.168.168.20's password: 
Last login: Tue Jun 25 14:02:19 2024

[root@test1 opt]# ./ssh1.sh root@192.168.168.30
spawn ssh root@192.168.168.30
ssh: connect to host 192.168.168.30 port 22: No route to host
spawn_id: spawn id exp6 not open
    while executing
"interact"
    (file "./ssh1.sh" line 15)



[root@test1 opt]# ./ssh1.sh root@192.168.168.30
spawn ssh root@192.168.168.30
The authenticity of host '192.168.168.30 (192.168.168.30)' can't be established.
ECDSA key fingerprint is SHA256:yaufdRU2oi//z+PpV7wdWdPdTdEZT2SrypnKy30CsdY.
ECDSA key fingerprint is MD5:85:b0:7c:f3:f0:3a:95:f0:25:19:47:f4:90:46:bc:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.168.30' (ECDSA) to the list of known hosts.
root@192.168.168.30's password: 
Last login: Tue Jun 25 14:17:43 2024 from 192.168.168.11


四、作业:

#免交互实现硬盘分区,分一个区即可,第一步要格式化,第二部实现挂载,挂载(手动挂载),然后再这个分区的挂载创建一个文件,写入内容"学习真好",并且打印结果。

#在一个脚本里完成,嵌入模式。

#免交互实现硬盘分区,分一个区即可,第一步要格式化,第二部实现挂载,挂载(手
动挂载),然后再这个分区的挂载创建一个文件,写入内容"学习真好",并且打印结>果。

#在一个脚本里完成,嵌入模式。
#!/bin/bash
#非交互指令
#免交互指令
/usr/bin/expect <<-EOF
spawn fdisk /dev/sdb
expect "命令(输入 m 获取帮助):"
send "n\r"
expect "Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):"
send "p\r"
expect "分区号 (1-4,默认 1):"
send "1\r"
expect "起始 扇区 (2048-41943039,默认为 2048):"
send "\r"
expect "Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
"
send "+5G\r"
expect "命令(输入 m 获取帮助):"
send "w\r"
expect eof
EOF
mkfs.xfs -f /dev/sdb1
if [ $? -eq 0 ]
then
echo "分区创建成功"
mkdir /opt/data
mount /dev/sdb1 /opt/data
cd /opt/data
echo "学习真好" > file
cat file
else
echo "分区或文件系统创建失败"
fi





[root@test1 opt]# ./fenqu.sh
spawn fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
分区创建成功
学习真好

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

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

相关文章

谈谈在不同公司中的SAP职位

今天反客为主&#xff0c;聊一下这个HR的话题&#xff0c;考虑到SAP职位的专业性&#xff0c;感觉还是有必要谈一谈这个话题。最近跟几位HR的小伙伴聊了一下&#xff0c;讨论了下不同公司的SAP职位的招聘要求&#xff0c;感觉还是有那么几个存在的问题&#xff1a; 追求完美的…

goframe框架规范限制(but it should be named with “Res“ suffix like “XxxRes“)

背景&#xff1a; 首页公司最近要启动一个项目&#xff0c;公司主要业务是用java开发的&#xff0c;但是目前这个方向的项目&#xff0c;公司要求部署在主机上&#xff0c;就是普通的一台电脑上&#xff0c;电脑配置不详&#xff0c;还有经常开关机&#xff0c;所以用java面临…

Python实现万花筒效果:创造炫目的动态图案

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义绘制万花筒图案的函数主循环 完整代码 引言 万花筒效果通过反射和旋转图案创造出美丽的对称图案。在这篇博客中&#xff0c;我们将使用Python来实现一个动态的万花筒效果。通过利用Pygame库&#xf…

WebStorm配置路径别名(jsconfig.json)

项目是 ViteVueTs 新建一个 jsconfig.json文件 {"compilerOptions": {"baseUrl": ".","paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dist"] }然后在 vite.confi…

LLM-Transformer:经典与前沿方法详解

LLM-Transformer&#xff1a;经典与前沿方法详解 前言 大规模语言模型&#xff08;LLM&#xff09;是当前自然语言处理&#xff08;NLP&#xff09;领域的核心技术&#xff0c;而Transformer架构作为LLM的基础&#xff0c;极大地推动了这一领域的发展。本文将详细介绍LLM-Tra…

网页计算器的实现

简介 该项目实现了一个功能完备、交互友好的网页计算器应用。只使用了 HTML、CSS 和 JavaScript &#xff0c;用于检验web前端基础水平。 开发环境&#xff1a;Visual Studio Code开发工具&#xff1a;HTML5、CSS3、JavaScript实现效果 功能设计和模块划分 显示模块&#…

ASP.NETMVC-简单例子-数据库查询+razor使用+项目发布

环境&#xff1a; win10&#xff0c;SQL Server 2008 R2 参考&#xff1a; asp.net mvc框架之EF的使用 - black娃 - 博客园 https://www.cnblogs.com/fjiqiang/p/11131365.html 目录 数据库查询要求思路操作 razor使用项目发布要求实现 数据库查询 要求 从服务器的数据库中查…

独家专访|格行随身WiFi创始人——刘永先 格行随身wifi如何成为行业的领跑品牌?

随着移动互联网的普及和消费者对网络依赖性的增强&#xff0c;随身WiFi市场迎来了前所未有的发展机遇。然而&#xff0c;这一市场的迅速扩张也伴随着一系列问题&#xff0c;其中最为显著的就是市场乱象丛生。近日&#xff0c;有幸邀请到行业领跑品牌格行随身WiFi的刘总&#xf…

uboot 编译时传递参数实现条件编译

KCFLAGS make ARCHarm KCFLAGS-DENV_DEBUG CROSS_COMPILEaarch64-linux-gnu-env/sf.c env_sf_save 加入调试信息 # saveenv Saving Environment to SPI Flash... env_sf_save (1) spi_flash_erase (2) spi_flash_write is40000 Erasing SPI flash...Writing to SPI flash.…

JavaScript高级程序设计(第四版)--学习记录之对象、类和面向对象编程(中)

创建对象方式 工厂模式&#xff1a;用于抽象创建特定对象的过程。可以解决创建多个类似对象的问题&#xff0c;但没有解决对象标识问题。&#xff08;即新创建的对象是什么类型&#xff09; function createPerson(name, age, job) { let o new Object(); o.name name; o.age…

DSSAT作物模建模实践方法

随着数字农业和智慧农业的发展&#xff0c;基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。Decisi…

msvcp140_ATOMIC_WAIT.dll丢失的多种解决方法分享,实测有效

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp140_ATOMIC_WAIT.dll丢失”。那么&#xff0c;msvcp140_ATOMIC_WAIT.dll丢失是怎么回事呢&#xff1f;本文将从msvcp140_ATOMIC_WAIT.dll丢失的原因分析、对电脑的影响以及解决方…

linux 环境报错:Peer reports incompatible or unsupported protocol version

出现问题的原因&#xff1a; curl 不兼容或不支持的协议版本。 解决方案&#xff1a; yum update -y nss curl libcurl如此继续之前的操作即可。

【瞎折腾日常】服务器的cpu飙高到1000%了怎么破

一、故障起因 起因是用户反馈系统很卡,我登录普罗米修斯一看,发现docker部署得集群下的一个java应用服务器cpu爆了,直接冲到了1000%以上了,接着就是各种接口超时报警等,赶紧打开对应的服务器查看进程情况,这会使用jstack和top命令定位哪个线程占用的cpu比较大,定位代码问…

Python+Pytest+Allure+Yaml+Pymysql+Jenkins+GitLab接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人&#xff1a;CesareCheung 更新时间&#xff1a;2024.06.20 一、技术栈 PythonPytestAllureYamlJenkinsGitLab 版本要求&#xff1a;Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 安装python3.7&…

BMA530 运动传感器

型号简介 BMA530是博世&#xff08;bosch-sensortec&#xff09;的一款运动传感器。时尚简约的可穿戴设备为功能强大的组件提供了很小的空间。具有先进功能集的下一代加速度计是世界上最小的加速度传感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它专为紧凑型设备而设计&…

突发!Runway的Gen-3向所有人开放,媲美Sora!

7月2日凌晨&#xff0c;著名生成式AI平台Runway在官网宣布&#xff0c;其文生视频模型Gen-3 Alpha向所有用户开放使用。 上周日Runway只向部分用户提供了Gen-3的使用权限&#xff0c;「AIGC开放社区」也为大家解读了10个非常有代表性的视频案例。&#xff08;点击查看&#xf…

UE4_材质_使用彩色半透明阴影

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿大美临沂生活越来越好&#xff01; 本教程将介绍如何配置虚幻引擎来投射彩色半透明阴影。 此功能在许多应用中都很有用&#xff0c;常见例子就是透过彩色玻璃窗的彩色光。 一、半透明阴影颜色 阴影在穿过半…

2024.7.2作业

1. 梳理笔记(原创&#xff01;&#xff01;&#xff01;) 2.解析代码&#xff1a;分析每一步变量的取值 #include <stdio.h> int main(int argc, char *argv[]) { int a 10; //a10 int b a--; //b10 int c a b 2; //a9 b10 c21 int d (b--…

Python语言接入关键词搜索商品api疑点解析

接入关键词搜索商品API通常需要以下步骤&#xff1a; 了解API文档&#xff1a;首先&#xff0c;你需要阅读API的文档&#xff0c;了解API的基本功能、请求方式&#xff08;GET、POST等&#xff09;、请求参数、返回数据格式等信息。 安装必要的库&#xff1a;根据API的要求&am…