Linux免交互

免交互概念

不需要进入文件内部,可以在文件外对文件内容进行操作

sed 最强大的功能:改 新增

awk 最强大的功能:按行取列

如何对文本内容进行免交互

here document 免交互

对文本内容进行操作:标准输入的替代品

语法格式:

命令 <<标记

内容

标记

命令指的是Linux命令

以什么为开头,就以什么为结尾

注意事项:

1.标记可以使用任意合法字符。(字母和数字,一般不适用特殊符号。以字母为开头。EOF)

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

3.开头的标记可以加空格,但是会被自动省略。

wc命令对行的统计

-l:统计行数

-c:统计字节数

-w:统计单词数

通过read命令读取

bash 复制代码
[root@hj opt]# read i <<EOF
> test
> 123
> EOF
[root@hj opt]# echo $i
test
[root@hj opt]# 

免交互设置密码

因为设置密码需要输入两遍,一遍设置,一遍确认,所以有两行

免交互在文本中输入内容

tee

tee:本身就有标准输出的作用,可以直接把内容输入到文件当中

例:

向test2.txt输入了 I HAVE $i

外部再给i赋值

bash 复制代码
#!/bin/bash
#声明编辑器
file="test2.txt"
i="123"
#给i赋值
cat > $file <<EOF
I HAVE $i
#test2.txt输入  IHAVE $i
EOF
#标记结尾

整体赋值给变量

bash 复制代码
#!/bin/bash
var="Great! Hello World!"
#给var整体赋值
myvar=$(cat <<EOF
this is line 1;
today is weekends
$var
#引用
EOF
)
echo $myvar

若给EOF加上单引号,则无法交互,输出结果则直接是$var.没有具体内容

expect 免交互

主要作用:

自动化控制和测试,解决shell脚本中交互的问题。

expect建立在tcl语言基础上的工具

常用的转义字符:

\n:相当于换行,回车

\t:制表符,相当于tab键

\r:就是回车

\b:退格符

因为expect的文件位置在/usr/bin/expect中,所以他的shell并不是默认,得手动区分

多行注释

expect免交互

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

需要安装两个软件包:expect,tcl。但是安装了expect后就会有tcl(yum解决依赖关系就安装了tcl)

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

使用前需要先检查 :rpm -q expect 是否安装

如果没有安装需要 yum -y install expect 安装

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

相关命令

spawn

spawn后面一般都是Linux命令,表示开启会话或者进程,跟踪后续的交互信息。

expect:捕获

捕获命令相关内容,字符串匹配

send

发送指令,模拟用户输入

方式一:

expect "密码" {send "123456\r" }

写在一行必需要用花括号括起来

方式二:

expect "密码"

send "123456\r"

换行不需要花括号

方式三:多分支匹配模式

expect

{

"密码1" {send "123456\r"}

"密码2" {send "123456\r"}

"密码3" {send "123456\r"}

}

结束符:

1.expect eof

表示交互结束,等待执行结束,退回到原来的用户

expect默认等待时间是10秒 #退回之前的终端

2.interact

执行完成之后保持状态,把控制权交给控制台,然后停留在目标终端,不会退回原终端。

注意:只能二选一

set定义变量,设置参数

set timeout 5

lindex $argv 0\]为位置变量 > **exp_continue 和 expect是结合起来一起使用的,附加在expect判断项之后,匹配到expect的捕获内容之后的其他选项** 以 ssh@root 20.0.0.10为例![](https://file.jishuzhan.net/article/1710488431072645121/4a1a7e6e4aeec283737e18af21437f52.webp) ```bash expect { "connecting (yes/no)?" {send "yes\r"; exp_continue;} } expect set send_user #回显命令,跟echo一样,打印内容 ``` ### 免交互修改密码 ```bash #!/usr/bin/expect #使用expect得声明编辑器 set time 5 #设置超时时间 spawm passwd hj #给hj用户修改密码 expect "New passwd:" #捕获的内容是后续需要模拟用户输入的内容 send "123456\r" expect "Retype passwd:" send "123456\r" expect eof ``` ![](https://file.jishuzhan.net/article/1710488431072645121/d289d32b65f5450b586eebec95f4c0c9.webp) ![](https://file.jishuzhan.net/article/1710488431072645121/42ff689de26d5269c63d9491cf4d57d9.webp) 自动修改成功 ![](https://file.jishuzhan.net/article/1710488431072645121/49794fc0eb44a5c349e2870ddaeed1fd.webp) > 一定要给脚本权限,否则无法运行 ![](https://file.jishuzhan.net/article/1710488431072645121/86ab0edc959bedc97c3856ed138a2ec9.webp) ## 嵌入执行模式 > **将expect免交互的过程和shell结合起来** > > **ssh su 会涉及到终端切换,不建议使用嵌入式执行** ![](https://file.jishuzhan.net/article/1710488431072645121/00ff4978422244dc785ce6ea1ed9ce70.webp) ![](https://file.jishuzhan.net/article/1710488431072645121/189f100d069d4972c5d5964542ef386d.webp) > ### ssh自动登录实现 > > ![](https://file.jishuzhan.net/article/1710488431072645121/e03d669a1c3400a1621dd41b637c346e.webp) ```bash #!/usr/bin/expect set timeout 5 set username [lindex $argv 0] set passwd [lindex $argv 1] #传参 #开启进程,捕获 spawn ssh $username #捕获条件 expect { "No route to host" {send_user "主机名/IP有误\n"} "Connection refused" {send_user "ssh访问被拒绝\n} "(yes/no)?" {send "yes\r";exp_continue;} "passwd" {send "$passwd\r"} } interact ``` ![](https://file.jishuzhan.net/article/1710488431072645121/1045a5c77bf89b917a5589608e55db03.webp) ![](https://file.jishuzhan.net/article/1710488431072645121/a2d42942f989ade8368bb46630eb69d2.webp) > ### 免交互的方式进行硬盘分区和格式化以及挂载 > > ![](https://file.jishuzhan.net/article/1710488431072645121/e152ef72456a0266d07ceaf3d4dfeff9.webp) ```bash #!/bin/bash name=$1 /usr/bin/expect <<-EOF set timeout 5 spawn fdisk $name expect "Command" send "n\r" expect "Select" send "p\r" expect "Partition" send "\r" expect "First sector" send "\r" expect "Last sector" send "+2G\r" expect "Command (m for help)" send "w\r" interact EOF partprobe num=$(lsblk | egrep -o sd[b-z][1-9]+ | sed -n '$p') #进行过滤,取最后一行,所以创建分区必须从头到尾 #如果想避免此情况可以设定参数直接在最后赋值 mkfs.xfs /dev/${num} #创建文件系统 mkdir /opt/${num} #创建挂载目录 mount /dev/${num} /opt/${num} #挂载 ``` ![](https://file.jishuzhan.net/article/1710488431072645121/76a7a304f7b1da2f833bc79fe5a007c8.webp) > > ## 免交互任务完成思路 > ### 1.实现免交互任务,可以先手动进行一边此任务,记住需要手动输入的项,该项就是此任务需要捕获的内容,后续进行expect匹配捕获和send发送捕获内容的指令即可 ### 2.spawn一般为linux 命令,表示开启会话或者进程(就是运行后会有一系列操作的命令,如fdisk,passwd等等),单行实现的命令(如mkdir mount挂载等)直接写入脚本内即可 ### 3涉及到终端切换的,不建议使用嵌入式执行 ### 4.脚本书写完一定要给权限 chmod 777 xx.sh

相关推荐
chem411116 分钟前
Conmon lisp Demo
服务器·数据库·lisp
渗透测试老鸟-九青18 分钟前
面试经验分享 | 成都渗透测试工程师二面面经分享
服务器·经验分享·安全·web安全·面试·职场和发展·区块链
阳小江20 分钟前
Docker知识点
运维·docker·容器
m0_5557629027 分钟前
QT 动态布局实现(待完善)
服务器·数据库·qt
极客柒1 小时前
RustDesk 开源远程桌面软件 (支持多端) + 中继服务器伺服器搭建 ( docker版本 ) 安装教程
服务器·docker·开源
只是橘色仍温柔1 小时前
xshell可以ssh连接,但vscode不行
运维·vscode·ssh
IT里的交易员2 小时前
【系统】换硬盘不换系统,使用WIN PE Ghost镜像给电脑无损扩容换硬盘
运维·电脑
共享家95272 小时前
深入剖析Linux常用命令,助力高效操作
linux·运维·服务器
大刘讲IT2 小时前
制造业数字化转型:流程改造先行还是系统固化数据?基于以MTO和MTS的投资回报分析
运维·经验分享·生活·产品经理·数据可视化
Zfox_2 小时前
【C++项目】从零实现RPC框架「四」:业务层实现与项目使用
linux·开发语言·c++·rpc·项目