Linux免交互

免交互概念

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

sed 最强大的功能:改 新增

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

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

here document 免交互

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

语法格式:

命令 <<标记

内容

标记

命令指的是Linux命令

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

注意事项:

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

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

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

Linux免交互_第1张图片

赋值

Linux免交互_第2张图片

免交互设置密码

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

Linux免交互_第3张图片

免交互在文本中输入内容

Linux免交互_第4张图片

tee

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

Linux免交互_第5张图片

例:

向test2.txt输入了  I HAVE $i

外部再给i赋值

#!/bin/bash
#声明编辑器
file="test2.txt"
i="123"
#给i赋值
cat > $file <

Linux免交互_第6张图片

Linux免交互_第7张图片

整体赋值给变量

#!/bin/bash
var="Great! Hello World!"
#给var整体赋值
myvar=$(cat <

Linux免交互_第8张图片

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

Linux免交互_第9张图片

expect 免交互

主要作用:

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

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

常用的转义字符:

\n:相当于换行,回车

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

\r:就是回车

\b:退格符Linux免交互_第10张图片

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

expect免交互相关命令

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

Linux免交互_第11张图片

[lindex $argv 0]为位置变量

exp_continue 和 expect是结合起来一起使用的,附加在expect判断项之后,匹配到expect的捕获内容之后的其他选项

以 ssh@root 20.0.0.10为例Linux免交互_第12张图片

expect {

  "connecting (yes/no)?"  {send "yes\r"; exp_continue;}

}

expect

set

send_user

#回显命令,跟echo一样,打印内容

免交互修改密码

#!/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

Linux免交互_第13张图片

Linux免交互_第14张图片

自动修改成功

Linux免交互_第15张图片

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

Linux免交互_第16张图片

嵌入执行模式

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

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

Linux免交互_第17张图片

Linux免交互_第18张图片

ssh自动登录实现

Linux免交互_第19张图片

#!/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

Linux免交互_第20张图片

Linux免交互_第21张图片

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

Linux免交互_第22张图片

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

Linux免交互_第23张图片

总结

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

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

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

你可能感兴趣的:(linux,运维,服务器)