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为例

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

自动修改成功

一定要给脚本权限,否则无法运行

嵌入执行模式

将expect免交互的过程和shell结合起来

ssh su 会涉及到终端切换,不建议使用嵌入式执行

ssh自动登录实现

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

免交互的方式进行硬盘分区和格式化以及挂载

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}
#挂载

免交互任务完成思路

1.实现免交互任务,可以先手动进行一边此任务,记住需要手动输入的项,该项就是此任务需要捕获的内容,后续进行expect匹配捕获和send发送捕获内容的指令即可

2.spawn一般为linux 命令,表示开启会话或者进程(就是运行后会有一系列操作的命令,如fdisk,passwd等等),单行实现的命令(如mkdir mount挂载等)直接写入脚本内即可

3涉及到终端切换的,不建议使用嵌入式执行

4.脚本书写完一定要给权限 chmod 777 xx.sh

相关推荐
A小辣椒20 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式