[转帖]spawn....expect简介及EOF遇到的坑

spawn,expect,简介,eof,遇到 · 浏览次数 : 0

小编点评

**spawn expect简介及EOF遇到的坑 为什么使用spawn expect …** spawn expect命令用于启动一个新的进程,用来执行后面所接的expect命令。但是,spawn expect命令与bash不同,在shell脚本中使用expect命令时,不能直接使用spawn ... expect的。 **EOF前后一定不能有空格!** EOF (End-of-File)是expect命令中用于指定输入内容的结束符,而空格是字符的最小单位,所以在EOF前后不能有空格。 **其他坑:** * 使用spawn expect时,要注意命令的顺序,因为expect命令的执行是阻塞的,等其结束才返回给shell。 * 使用spawn expect时,要注意与expect命令的语法一致,否则可能会导致expect命令出错。 **总结:** spawn expect是一款功能强大的工具,可以实现自动的交互式任务,无需人工干预。但是,在使用spawn expect时,要注意EOF前后一定不能有空格,否则可能会导致expect命令出错。

正文

为什么使用spawn expect …

很多时候,指令的执行是需要交互的,比如下面这个命令大家一定很熟悉:

ssh-keygen -t rsa
# 以及
ssh-copy-id -i /home/xxx/.ssh/id_rsa.pub $username@$host_name

    这里需要按三次回车键,或输入yes/no,以及密码才可以.当然,还是那句话单点操作随意,如果一项工作重复次数超过2次,那么我们就应该用脚本来管理它,比如我们要在一个集群规模的每个节点都进行上面的操作,那真的是会很累很累…

    expect

    expect是一款免费的工具,可以实现自动的交互式任务,无需人工干预.
    它可以根据程序的提示信息,来模拟标准输入,提供给程序,以此来实现自动化交互执行的目的.

    yum provides expect
    # 或直接安装
    yum install -y expect
    

      expect命令

      命令作用
      spawn启动一个新的进程,用来执行后面所接的COMMAND
      expect期待从进程中获取的内容
      send向进程发送内容
      set timeout n设置超时时间,单位:,超过n秒则不再继续等待进程的内容返回
      interact是否保留交互状态

      命令演示

      expect脚本文件的头信息与bash不同,这里需要注意
      在这里强烈建议大家养成脚本注释的习惯,日后真的非常有用.

      #!/usr/bin/expect
      #    Program:
      #        run the basic test of expect
      #    2020/01/19    Shuu    First release
      spawn ssh test
      expect "yes/no"
      send "yes\r"
      expect "password*"
      send "test\r"
      expect eof
      

        上面的例子,我创建了一个test用户,密码也是test,来进行测试.
        执行之后虽然命令提示符会显示test@xxxxxx
        在这里插入图片描述
        但是执行whoami命令后,会发生改变,而且执行结果并不是test用户.
        那么如果想继续留在test用户下进行操作该怎么办呢?interact的作用来了

        #!/usr/bin/expect
        #    Program:
        #        run the basic test of expect
        #    2020/01/19    Shuu    First release
        spawn ssh test
        expect "yes/no"
        send "yes\r"
        expect "password*"
        send "test\r"
        interact
        

          仅修改最后一行的expect eof为interact即可.将.ssh目录删掉,再次运行

          rm -rf ~/.ssh
          

            在这里插入图片描述
            上面的内容还可以用另一种方式来书写:
            Pattern—— Action:模式和动作,模式可以有多种,每匹配到一种模式进行相应的动作.

            #!/usr/bin/expect
            #    Program:
            #        run the basic test of expect
            #    2020/01/19    Shuu    First release
            spawn ssh test
            expect {
                "yes/no" {send "yes\r";exp_continue}
                "password*" {send "test\r"}
            }
            expect eof
            # or
            # interact
            

              exp_continue,表示继续进行余下的模式匹配,除最后一个一般都要加,否则没必要写那么多Pattern不是吗.

              在shell脚本中使用expect

              由于expect与bash不同,(从表头就能看出),所以在shell脚本中是不能直接使用spawn ... expect的.
              具体写法如下:

              #!/bin/bash
              #        Program:
              #            details
              #    yyyy/MM/dd Author release
              /usr/bin/expect <<EOF
                  spawn ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub $username@$host_name
                  expect {
                      "yes/no" {send "yes\r";exp_continue}
                      "password" {send "$password\r"}
                  }
                  expect eof
              EOF
              

                这里的/usr/bin/expect会进入expect命令行交互模式
                在这里插入图片描述
                而后面的 <<EOF表示知道接收到EOF字符为止,一直接收输入内容,当接收到EOF字符时,结束本次expect操作.
                !!!这里是个坑重要的事情说三遍:
                EOF前后一定不能有空格
                EOF前后一定不能有空格
                EOF前后一定不能有空格
                所以,对代码缩进格式有着强迫症的同学要注意啦!!!
                最后一行那个EOF一定要在起始位置,不能有空格!!!

                </article>
                

                与[转帖]spawn....expect简介及EOF遇到的坑相似的内容:

                [转帖]spawn....expect简介及EOF遇到的坑

                spawn....expect简介及EOF遇到的坑 为什么使用spawn expect ....expectexpect命令命令演示在shell脚本中使用expect 为什么使用spawn expect … 很多时候,指令的执行是需要交互的,比如下面这个命令大家一定很熟悉: ssh-keygen -

                [转帖]Linux ssh远程执行命令

                [root@slave1 docker]# vi remoteShellExec.sh [root@slave1 docker]# #!/bin/bash passwd='root@123' /usr/bin/expect<

                [转帖]配置ftp连接对象存储bucket子目录的方法

                https://developer.jdcloud.com/article/1838 配置ftp连接对象存储bucket子目录的方法 京东云技术交付部 2021-01-27 IP归属:未知 44160浏览 收藏 云主机 云计算 公有云

                [转帖]

                Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

                [转帖]

                https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

                [转帖]ISV 、OSV、 SIG 概念

                ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

                [转帖]Redis 7 参数 修改 说明

                2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

                [转帖]HTTPS中间人攻击原理

                https://www.zhihu.com/people/bei-ji-85/posts 背景 前一段时间,公司北京地区上线了一个HTTPS防火墙,用来监听HTTPS流量。防火墙上线之前,邮件通知给管理层,我从我老大那里听说这个事情的时候,说这个有风险,然后意外地发现,很多人原来都不知道HTTPS防

                [转帖]关于字节序(大小端)的一点想法

                https://www.zhihu.com/people/bei-ji-85/posts 今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下: 为什么网络字节序(多数情况下)是大端? 早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地

                [转帖]awk提取某一行某一列的数据

                https://www.jianshu.com/p/dbcb7fe2da56 1、提取文件中第1列数据 awk '{print $1}' filename > out.txt 2、提取前2列的文件 awk `{print $1,$2}' filename > out.txt 3、打印完第一列,然后打