[转帖]Shell编程之免交互

shell,编程,交互 · 浏览次数 : 0

小编点评

**内容生成指南** **1. 引言** * 概述内容目的和使用场景 * 注意事项 **2. 概述** * 脚本的基本结构 * 脚本中的常用函数和变量 **3. 脚本的结构** * 脚本的入口部分 * 脚本的执行部分 * 脚本的出口部分 **4. 脚本中的常用函数和变量** * `expect` * `set` * `spawn` * `useradd` * `timeout` **5. 脚本的常用操作** * `expect`中的使用 * `set`中的赋值 * `spawn`中的执行 * `useradd`中的使用 * `timeout`中的设置 **6. 脚本的示例** *免交互修改用户密码 *实现 ssh 自动登录 **7. 总结** * 生成内容时需要带简单的排版 * 使用 `expect`、`set`、`spawn`等函数进行脚本操作 * 脚本中的 `expect`中的使用 * 脚本中的 `set`中的赋值 * 脚本中的 `spawn`中的执行 * 脚本中的 `useradd`中的使用 * 脚本中的 `timeout`中的设置

正文


交互的概念与Linux中的运用

交互:当计算机播放某多媒体程序的时候,编程人员可以发出指令控制该程序的运行,而不是程序单方面执行下去,程序在接受到编程人员相应的指令后而相应地做出反应。

对于Linux操作系统中,有许多操作都会触及到交互(根据系统的指示做出相对应的操作满足操作者的需求),对于shell脚本的自动化运维,就要实现免交互来达到自动化运维的效果。
常用的交互程序:read,ftp,passwd,su,sudo,fdisk等等 。
cat也可配合免交互的方式重定向输出到文件。

Here Document 免交互

使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个“文件”并用作“命令”的标准输入。
Here Document 也可以与非交互式程序和命令一起使用。

语法格式:

命令 <<标记

内容 #标记之间是传入内容

标记
ky27

注意事项:
1、标记可以使用任意合法字符(通常为EOF)
2、结尾的标记一定要顶格写,前面不能有任何字符
3、结尾的标记后面也不能有任何字符(包括空格)
4、开头标记前后的空格会被省略掉

免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给 wc -l 来统计
在这里插入图片描述

通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,作为变量 i 的值
在这里插入图片描述

通过 passwd 给用户设置密码
在这里插入图片描述
通过cat实现查看和重定向输出到指定文件
在这里插入图片描述
在这里插入图片描述

tee命令重定向输出加标准输出

在这里插入图片描述

支持变量替换

在写入文件时会先将变量替换成实际值,再结合 cat 命令完成写入

#!/bin/bash
file="test1.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOF

    在这里插入图片描述

    整体赋值给变量,然后通过 echo 命令将变量值打印出来

    #!/bin/bash
    var="Great! I am going to school!"
    myvar=$(cat <<EOF                        
    This is Line 1.
    Today is Monday.
    $var
    EOF
    )
    echo "$myvar"             
    

      在这里插入图片描述

      关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换

      #!/bin/bash
      var="Great! I am going to school!"
      myvar=$(cat <<'EOF'			          		 
      This is Line 1.
      Today is Monday.
      $var
      EOF
      )
      echo $myvar        
      

        在这里插入图片描述

        多行注释

        Bash 的默认注释是“#”,该注释方法只支持单行注释;Here Document 的引入解决了多行注释的问题。
        “:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。

        #!/bin/bash
        var="Great! I am going to school!"
        : <<EOF                             
        This is Line 1.
        Today is Monday.
        $var
        EOF
        echo "$var" 
        

          在这里插入图片描述

          Expect

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

          • 建立在tcl之上的一个工具
          • 用于进行自动化控制和测试
          • 解决shell脚本中交互相关的问题

          expect它是一个程序,所以也是需要提前安装才能使用的

          rpm -q expect
          rpm -q tcl
          yum install -y expect

          常见的转义字符及其用法:
          \n:表示换行符。
          \t:表示制表符。
          \r:表示回车符。
          \b:表示退格符。

          基本命令:
          (1)脚本解释器
          expect 脚本中首先引入文件,表明使用的是哪一个 shell。
          #!/usr/bin/expect
          chmod 777 xxx.sh
          bash sh
          ./
          (2)spawn
          spawn 后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息。
          例:spawn passwd root

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

          (4)send
          向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r(回车)或者\n
          例:
          方式一:
          expect “密码” {send “abc123\r”} #同一行send部分要有{}

          方式二:
          expect “密码”
          send “abc123\r” #换行send部分不需要有{}

          方式三:
          expect支持多个分支

          expect #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
          {
          “密码1” {send “abc123\r”}
          “密码2” {send “123456\r”}
          “密码3” {send “123123\r”}
          }

          (5)结束符 expect eof
          expect eof
          表示交互结束,等待执行结束,退回到原用户,与spawn对应。
          比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户
          一句话,也就是切换之前的终端用户

          interact
          执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。
          一句话:也就是留在当前终端用户

          注意:expect eof 与 interact 只能二选一。

          (6)set
          expect 默认的超时时间是 10 秒,通过 set 命令可以设置会话超时时间,
          若不限制超时时间则应设置为-1。
          例:set timeout 5

          (7)exp_continue
          exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。exp_continue 类似于控制语句中的 continue 语句。表示允许 expect 继续向下执行指令。
          例如:下例将判断交互输出中是否存在 yes/no 或 *password。如果匹配 yes/no 则输出 yes 并再次执行判断;
          如果匹配 *password 则输出 abc123 并结束该段 expect 语句。

          expect {
          “(yes/no)” {send “yes\r”; exp_continue;}
          “*password” {set timeout 300; send “abc123\r”;}
          }

          注意:使用exp_continue时,如果跟踪像 passwd 这样的输入密码后就结束进程的命令,expect{}外不要再加上expect eof
          因为spawn进程结束后会默认向expect发送eof,会导致后面的 expect eof 执行报错

          (8)send_user
          send_user 表示回显命令,相当于 echo。打印的功能

          (9)接收参数
          expect 脚本可以接受从bash命令行传递的参数,使用[lindex $argv n]获得。其中n从0开始,分别表示第一个,第二个,第三个…参数。类似与位置变量,用法相同
          例:
          set hostname [lindex $argv 0] 相当于 hostname=$1
          set password [lindex $argv 1] 相当于 password=$2

          注意:expect脚本不能通过bash、source来执行(因为这三种方式是调用shell解释器),只能通过绝对路径或相对路径来执行。

          实例操作

          免交互预设值修改用户密码

          #!/usr/bin/expect    
          

          #脚本用于实现免交互修改用户的密码

          set timeout 5

          spawn passwd lisi

          expect "新的 密码"
          send "123abc\r"
          expect "重新输入新的 密码"
          send "123abc\r"

          expect eof

            在这里插入图片描述

            创建用户并设置密码

            嵌入执行模式,将 expect 过程融入 Shell 当中,方便执行和处理。
            像ssh、su这种会切换环境的交互式命令一般不建议使用嵌入执行模式。

            #!/bin/bash
            user=$1
            password=$2
            

            useradd $user

            /usr/bin/expect <<-EOF
            spawn passwd $user

            expect "新的*"
            send "\({password}</span><span class="token entity" title="\r">\r</span>" expect "重新*" send "<span class="token variable">\){password}\r"
            expect eof
            EOF

              在这里插入图片描述

              实现 ssh 自动登录

              #!/usr/bin/expect
              set ip 192.168.154.11
              set user root
              set password 123
              set timeout 10
              spawn ssh $user@$ip
              expect {
                      "yes/no" {send "yes\r";exp_continue}
                      "password" {send "$password\r"}
              }
              expect eof
              

                在这里插入图片描述

                文章知识点与官方知识档案匹配,可进一步学习相关知识
                云原生入门技能树首页概览12811 人正在系统学习中

                与[转帖]Shell编程之免交互相似的内容:

                [转帖]Shell编程之免交互

                目录 交互的概念与Linux中的运用Here Document 免交互tee命令重定向输出加标准输出支持变量替换多行注释Expect实例操作免交互预设值修改用户密码创建用户并设置密码实现 ssh 自动登录 交互的概念与Linux中的运用 交互:当计算机播放某多媒体程序的时候,编程人员可以发出指令控制

                [转帖]Shell编程之函数

                目录 Shell函数使用Shell函数的优点 Shell 函数定义使用原则函数传参函数变量的作用范围 函数递归阶乘递归目录函数库 Shell函数 将命令序列按格式写在一起可方便重复使用命令序列Shell函数定义 调用函数的方法 使用Shell函数的优点 使用函数可以避免代码重复使用函数可以将大的工程

                [转帖]Shell编程之正则表达式与文本处理器(grep、sort、uniq、tr、cut)

                目录 正则表达式概念正则表达式的作用元字符grep命令在文本中查找指定的字符串sort命令排序uniq命令快捷去重tr命令替换、压缩和删除cut命令快速裁剪命令expr substr 截取方法cut截取方法 split命令文件拆分paste命令文件合并eval变量扫描器位置锚定分组或其他扩展正则表达

                [转帖]shell编程之循环语句

                目录 一、循环语句for循环for语句的结构嵌套循环 while语句的结构while语句应用示例 until语句的结构until语句示例 二、跳出循环continue跳出循环break跳出循环 三、常用循环脚本实例循环打印9*9乘法表数字累加脚本(1-100)常用转义字符购物shell 计算器正等腰

                [转帖]Bash脚本编程学习笔记10:参数展开

                https://www.cnblogs.com/alongdidi/p/bash_parameter_expansion.html 简介 原标题叫做《Bash脚本编程之字符串处理》。 其实这里说得字符串处理,对应的是bash官网中的【Shell Parameter Expansion】,不过直接去看

                [转帖]生产环境shell脚本安全之shc编译(转C)

                https://www.jianshu.com/p/17399dcd1471 应用场景很多,如,中小项目大多使用mysql,那么在你的mysqladmin备份脚本里可能存在明文的密码,此时由于公司服务器可能多个同事使用,那么转码加密脚本至关重要! 1,首先 SHC安装(建议使用交新版本,如 4.0.

                [转帖]shell编程-字符截取命令

                grep 命令 命令格式: grep [选项] 查找的字符串 文件名 作用: 在文件中搜索查找字符串,显示匹配字符串所在的行。 选项: -i:查找时忽略大小写。-n:显示行号。-v:反向查找(把不含有要搜索字符串的所有行显示出来)。-c:计算匹配到 ‘搜寻字符串’ 的次数。-r:在指定的目录中查找,

                [转帖]Linux Shell编程 循环语法

                https://zhuanlan.zhihu.com/ for循环 for 循环是固定循环,也就是在循环时已经知道需要进行几次循环。有时也把 for 循环称为计数循环。语法: for 变量 in 值1 值2 值3… do 程序 done 在这种语法中,for 循环的次数取决于 in 后面值的个数(以

                [转帖]linux shell中 if else以及大于、小于、等于逻辑表达式介绍

                https://www.jb51.net/article/34332.htm 在linux shell编程中,大多数情况下,可以使用测试命令来对条件进行测试,这里简单的介绍下,方便需要的朋友 比如比较字符串、判断文件是否存在及是否可读等,通常用"[]"来表示条件测试。注意:这里的空格很重要。要确保方

                [转帖]整理收藏:shell中的test条件测试

                https://zhuanlan.zhihu.com/p/504991399 shell编程中经常会有很多需要逻辑判断的地方,比如一个文件/文件夹是否存在,字符串是否为空等等,而test就具有这样的优良传统,将我们需要的结果通过简单的表达式查询,从而通过状态码$?取值。 1.对文件类型的检测 -e: