• Shell编程之免交互


    一、Here Document免交互

    1.1 Here Document概述

    • 使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp、passwd、sudo、ssh、cat或read命令。

    • 是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个“文件”并用作“命令”的标准输入。

    • Here Document也可以与非交互式程序和命令一起使用。

    1. 命令 <<标记 (此处标记的前后面可以有空格)
    2. ...
    3. 内容 #标记之间是传入内容
    4. ...
    5. 标记 #结尾的标记字符要和开头的标记字符,保持相同的大小写,并且结尾标记必须要顶格写

    注意事项:

    1. 表示可以使用任意的合法字符(通用的字符是EOF表示end of file)
    2. 结尾的标记是一定要顶格写,前面不能有任何字符(包括空格)
    3. 结尾的标记后面也不能有任何字符(包括空格)
    4. 开头标记前后空格会被省略掉

    二、应用示例

    1 直接把输入的内容从命令行输出
    1. [root@localhost /home]#cat <<EOF
    2. > hello
    3. > moto
    4. > EOF
    5. hello
    6. moto
    2 输入保存到文件中
    1. [root@localhost /home]#cat >name<<EOF
    2. > zhangsan
    3. > lisi
    4. > wangwu
    5. > EOF
    6. [root@localhost /home]#cat name
    7. zhangsan
    8. lisi
    9. wangwu
    3 追加输入保存到文件
    1. [root@localhost /home]#cat >>name<
    2. > xiaoming
    3. > EOF
    4. [root@localhost /home]#cat name
    5. zhangsan
    6. lisi
    7. wangwu
    8. xiaoming
    4 对行数进行统计
    1. [root@localhost /home]#wc -l <<EOF
    2. > test1
    3. > test2
    4. > test3
    5. > EOF
    6. 3
    5 给变量赋值
    1. #通过read 命令接收输入并打印,输入值是两个EOF标记之间的部分,作为变量 a 的值
    2. [root@localhost /home]#read a <<EOF
    3. > 8
    4. > EOF
    5. [root@localhost /home]#echo $a
    6. 8
    6 免交互设置密码
    1. [root@localhost /home]#useradd laowang
    2. [root@localhost /home]#passwd laowang <<EOF
    3. > 123456
    4. > 123456
    5. > EOF
    6. 更改用户 laowang 的密码 。
    7. 新的 密码:无效的密码: 密码少于 8 个字符
    8. 重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
    7 变量替换
    1. [root@localhost /home]#vim test.sh
    2. #!/bin/bash
    3. doc_file="gkd.txt"
    4. i="nanjing"
    5. cat > $doc_file <<EOF
    6. welcome to $i
    7. EOF
    8. [root@localhost /home]#sh test.sh
    9. [root@localhost /home]#cat gkd.txt
    10. welcome to nanjing
    8 整体赋值给变量,用echo将变量值打印出来
    1. [root@localhost /home]#vim test2.sh
    2. #!/bin/bash
    3. test="you are very good!"
    4. mylife=$(cat <<EOF
    5. 冲冲冲!
    6. 干就完了!!!
    7. $test
    8. EOF
    9. )
    10. echo $mylife
    11. [root@localhost /home]#sh test2.sh
    12. 冲冲冲! 干就完了!!! you are very good!
    9 关闭变量替换的功能
    1. #对标记加单引号,即可关闭变量替换
    2. [root@localhost /home]#aa=$(cat <<'EOF'
    3. > 10
    4. > $a
    5. > EOF
    6. > )
    7. [root@localhost /home]#echo $aa
    8. 10 $a
    9. [root@localhost /home]#echo $a
    10. 8
    10 去掉每行之前的 TAB 字符(顶格显示)
    1. [root@localhost /home]#vim test3.sh
    2. #!/bin/bash
    3. cat <<EOF
    4. hello
    5. EOF
    6. cat <<EOF
    7. word
    8. EOF
    9. [root@localhost /home]#sh test3.sh
    10. hello
    11. word
    12. [root@localhost /home]#vim test3.sh #EOF前面添加“-”能够去掉行首的tab制表符
    13. #!/bin/bash
    14. cat <<-EOF
    15. hello
    16. EOF
    17. cat <<-EOF
    18. word
    19. EOF
    20. [root@localhost /home]#sh test3.sh #加了“-”以后显示出的内容就会顶格显示
    21. hello
    22. word
    11 多行注释
    1. [root@localhost /home]#vim test4.sh
    2. #!/bin/bash
    3. : <<EOF #冒号表示多行注释,开头的标记内容不会被执行
    4. hello?
    5. who are you?
    6. EOF
    7. echo "What is the matter with you?"
    8. [root@localhost /home]#sh test4.sh
    9. What is the matter with you?
    1. Bash 的默认注释是“#”,该注释方法只支持单行注释,在 Shell 脚本的工作中,“#”右侧的任何字符串,bash 都会将其忽略。
    2. “ : ”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。

    三、Expect 免交互

    1、概述

    expect 是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预,就是一套用来实现自动交互功能的软件。且想要用之前先下载 Expect。

    [root@localhost /home]#yum install -y expect
    

    2、基本命令

    1、脚本解释器

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

    #!/usr/bin/expect
    
    2、spawn

    spawn 后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息

    spawn passwd root
    
    3、 expect
    • 判断上次输入结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
    • 只能捕捉由 spawn 启动的进程的输出
    • 用于接收命令执行后的输出,然后和期望的字符串匹配
    4、 send

    向进程发送字符串,用于模拟用户的输入,该命令不能自动回车换行,一般要加 \r (回车) 或者 \n

    1. expect "密码" {send "abc123\r"} #同一行send部分要有{}
    2. expect "密码"
    3. send "abc123\r" #换行send部分不需要有{}
    1. expect
    2. "密码1"{ send "abc123\r"}
    3. "密码2"{ send "123456\r"}
    4. "密码3"{ send "123123\r"}
    5. #expect支持多个分支,只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
    5、 结束符

    expect eof

    1. 表示交互结束,等待执行结束,退回到原用户,与spawn对应
    2. 比如:切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,就会自动切回原用户

    interact

    1. 执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端,这个时候就可以手工操作了,interact 后的命令不起作用
    2. 比如 interact 会保持在终端而不会退回到原终端,比如切换到 root 用户,会一直在 root 用户状态下
    3. 比如2 ssh 到另一服务器,会一直在目标服务器终端,而不会切回的原服务器

    需要注意的是:expect eof 与 interact 只能二选一

    1. su
    2. zhangsan -> lisi
    3. ssh192.168.80.10 ->192.168.80.20
    4. 使用expect eof会出现如下情况:
    5. zhangsan -> lisi --expect eof--> 退回到原用户zhangsan
    6. 192.168.80.10 -> 192.168.80.20 --expect eof--> 退回到原IP地址:192.168.80.10
    7. 使用interact会出现如下情况:
    8. zhangsan -> lisi --interact--> 仍然保持用户lisi的状态
    9. 192.168.80.10 ->192.168.80.20 --interact--> 仍然保持在IP地址:192.168.80.20
    6 set

    expect 默认的超时时间是10秒,通过 set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1

    set timeout 20

    Expect 案例

     免交互修改密码:

    1. [root@test1 opt]# vim passwd.sh
    2. #!/usr/bin/expect #expect的路径指定使用expect编译器
    3. set timeout 3 #设置退时间
    4. spawn passwd zjf #开启修改密码
    5. expect "新的 密码:" #捕获
    6. send "123\r" #设置密码
    7. expect "重新输入新的 密码:" #捕获
    8. send "123\r" #设置密码
    9. expect eof #退出

      免交互方式实现SSh登录:

    1. #!/usr/bin/expect
    2. set ip 192.168.198.12
    3. set user root
    4. set passwd 000000
    5. set timeout 5
    6. spawn ssh $user@$ip
    7. expect {
    8. "yes/no" {send "yes\n";exp_continue}
    9. "password" {send "${passwd}\n"}
    10. }
    11. interact

     

  • 相关阅读:
    印尼禁令频出,Shopee该站也停止销售跨境商品
    Leetcode—226.翻转二叉树【简单】
    Oracle 服务器迁移的一些经验
    为hade增加model自动生成功能
    iwebsec靶场 SQL注入漏洞通关笔记5- updatexml注入(报错型盲注)
    java计算机毕业设计ssm+vue社区公益服务平台
    944页40万字智能矿山项目建设整体解决方案(煤矿)2021
    React Hook----styled-components(样式组件化)
    嘉为蓝鲸受邀参加2022(第十届)国际智慧机场发展论坛
    力扣每日一题41:缺失的第一个正数
  • 原文地址:https://blog.csdn.net/2401_83330816/article/details/139650104