• Linux免交互


    免交互概念

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

    sed 最强大的功能:改 新增

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

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

    here document 免交互

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

    语法格式:

    命令 <<标记

    内容

    标记

    命令指的是Linux命令

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

    注意事项:

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

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

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

    wc命令对行的统计

    -l:统计行数

    -c:统计字节数

    -w:统计单词数

    通过read命令读取

    1. [root@hj opt]# read i <
    2. > test
    3. > 123
    4. > EOF
    5. [root@hj opt]# echo $i
    6. test
    7. [root@hj opt]#

    免交互设置密码

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

    免交互在文本中输入内容

    tee

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

    例:

    向test2.txt输入了  I HAVE $i

    外部再给i赋值

    1. #!/bin/bash
    2. #声明编辑器
    3. file="test2.txt"
    4. i="123"
    5. #给i赋值
    6. cat > $file <<EOF
    7. I HAVE $i
    8. #test2.txt输入 IHAVE $i
    9. EOF
    10. #标记结尾

    整体赋值给变量

    1. #!/bin/bash
    2. var="Great! Hello World!"
    3. #给var整体赋值
    4. myvar=$(cat <<EOF
    5. this is line 1;
    6. today is weekends
    7. $var
    8. #引用
    9. EOF
    10. )
    11. 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为例

    1. expect {
    2. "connecting (yes/no)?" {send "yes\r"; exp_continue;}
    3. }
    4. expect
    5. set
    6. send_user
    7. #回显命令,跟echo一样,打印内容

    免交互修改密码

    1. #!/usr/bin/expect
    2. #使用expect得声明编辑器
    3. set time 5
    4. #设置超时时间
    5. spawm passwd hj
    6. #给hj用户修改密码
    7. expect "New passwd:"
    8. #捕获的内容是后续需要模拟用户输入的内容
    9. send "123456\r"
    10. expect "Retype passwd:"
    11. send "123456\r"
    12. expect eof

    自动修改成功

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

    嵌入执行模式

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

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

    ssh自动登录实现

    1. #!/usr/bin/expect
    2. set timeout 5
    3. set username [lindex $argv 0]
    4. set passwd [lindex $argv 1]
    5. #传参
    6. #开启进程,捕获
    7. spawn ssh $username
    8. #捕获条件
    9. expect {
    10. "No route to host" {send_user "主机名/IP有误\n"}
    11. "Connection refused" {send_user "ssh访问被拒绝\n}
    12. "(yes/no)?" {send "yes\r";exp_continue;}
    13. "passwd" {send "$passwd\r"}
    14. }
    15. interact

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

    1. #!/bin/bash
    2. name=$1
    3. /usr/bin/expect <<-EOF
    4. set timeout 5
    5. spawn fdisk $name
    6. expect "Command"
    7. send "n\r"
    8. expect "Select"
    9. send "p\r"
    10. expect "Partition"
    11. send "\r"
    12. expect "First sector"
    13. send "\r"
    14. expect "Last sector"
    15. send "+2G\r"
    16. expect "Command (m for help)"
    17. send "w\r"
    18. interact
    19. EOF
    20. partprobe
    21. num=$(lsblk | egrep -o sd[b-z][1-9]+ | sed -n '$p')
    22. #进行过滤,取最后一行,所以创建分区必须从头到尾
    23. #如果想避免此情况可以设定参数直接在最后赋值
    24. mkfs.xfs /dev/${num}
    25. #创建文件系统
    26. mkdir /opt/${num}
    27. #创建挂载目录
    28. mount /dev/${num} /opt/${num}
    29. #挂载

    免交互任务完成思路

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

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

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

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

  • 相关阅读:
    基于Java毕业设计知识库系统源码+系统+mysql+lw文档+部署软件
    传奇开服架设之地图索引编辑器以及安装问题排查教程
    包管理工具cnpm的安装和使用
    【数据分享】上海市共享单车数据
    6.3 线性变换
    K8S云计算系列-(3)
    设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码
    第一章、基于Ruoyi-Vue开发脚手架之对象存储实现
    GO通道:无缓冲通道与缓冲通道
    039-java集合框架的作用及使用(Collection,Set,Map,SimpleDateFormat)
  • 原文地址:https://blog.csdn.net/qq_51506982/article/details/133583605