Shell编程之免交互篇

Here Document概述:

  • Here Document以标签形式实现面交互的过程
  • 使用I/O重定向的方式将命令列表提供给交互式程序
  • 使用输入的一种替代品
    语法格式:
命令 <<标记
...      ##交互内容
...
标记

免交互有两种方式

1.<< EOF的标记模式(适用于简单的交互方式,不能进行精确匹配)
2.exprt的方式;选项很多的时候就需要用到expect

Here Document使用注意事项

  • 标记可以使用任意合法字符;注意要用大写
  • 结尾的标记一定要顶格写,前面不能有任何字符
  • 结尾的标记后面不能有任何字符(包括空格)
  • 开头标记前后的空格会被省略掉
    在这里插入图片描述

Here Document变量设定

通过read命令接收输入并打印
在这里插入图片描述
这时再添加一个交互内容;赋值只会赋予第一排的内容,因为是逐行读取的
在这里插入图片描述
也可以直接在屏幕上输出
同样赋值也只会赋值第一个内容
在这里插入图片描述

Here Document免交互

通过read命令接收输入并打印
通过passwd给用户设置密码
正常给zhangsan用户设置密码是需要输入两次密码的
在这里插入图片描述
用面交互的方式个zhangsan用户设置密码;每一行只对应一次交互;passwd zhangsan有两次交互
在这里插入图片描述
在这里插入图片描述
注意写脚本需要先定义变量,在调用

  • 变量替换:
    变量替换示例
    在这里插入图片描述
    这时在opt目录下生成一个test.txt的文件
    在这里插入图片描述
  • 变量设定:
    需要先定义变量
    在这里插入图片描述

关闭变量替换功能

‘’不会引用交互内容中的变量,只是引用这个字符
在这里插入图片描述

Here Document格式控制

去除每行之前的TAB字符
正常的输出是这样的:
在这里插入图片描述
输出出来的话也是会有空格的
在这里插入图片描述
-’’去除每行的tab键
在这里插入图片描述
运行脚本发现空格被去除了
在这里插入图片描述

Here Document多行注释

通过Here Document方式使Bash支持多行注释
语法格式:

#!/bin/bash
: <<Doing
第一行注释
第二行注释
Doing

示例:
在这里插入图片描述
echo 输出结果为,只能输出没有被注释掉的内容
在这里插入图片描述

Expect概述:

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

Expect安装:

  • 挂载光盘
  • 制作本地YUM源
  • 执行安装命令

基本命令:

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

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

  • Spawn
    1.启动进程,并跟踪后续交互信息
    2.是先有了追踪指令后,才有的会的

  • 结束符
    1.expect eof;等待执行结束;一定要写
    2.interact;执行完成后保持交互状态,把控制权交给控制台

  • Set:
    1.设置超时时间,过期则继续执行后续命令
    2.单位是秒
    3.timeout - 1 表示永不超时
    4.默认情况下,timeout是10秒

  • Exp_continue:
    允许expect继续向下执行指令

  • Send_user:
    回显命令,相当于echo

  • 接收参数:
    1.expect脚本可以接受从bash传递的参数
    2.可以使用[linux $argv n]获得
    3.n从0开始,分别表示第一个,第二个,第三个…参数
    在这里插入图片描述

Expect(捕捉)语法:

单一分支语法;expect要配合send去使用

expect "password: " {send "mypassword\r";}

多分支模式语法:send命令不具备回车换行功能,一般要加\n或\n

expect "aaa" {send "AAA\r"}
expect "bbb" {send "BBB\r"}
expect "ccc" {send "CCC\r"}
 

●加continue和不加continue的区别:
将三个合在一起,就写成一下内容;但是当匹配上其中一个,就会跳过下面匹配字符串,执行下面的要求

expect {
"aaa" {send "AAA\n"}
"bbb" {send "BBB\n"}
"ccc" {send "CCC\n"}
}

加continue;当aaa匹配成功后就会继续向下面匹配bbb,不会跳过这层的expect

expect {
"aaa" {send "AAA";exp_continue}
"bbb" {send "BBB";exp_continue}
"ccc" {send "CCC"}
}

expect执行方式和案例:

直接执行:
案例:ssh远程登录
在这里插入图片描述
嵌入执行:
在这里插入图片描述
嵌入方式示例:
1.创建用户 jack 密码设为123456
在这里插入图片描述
在这里插入图片描述
2.利用expect完成ssh远程的登录过程:

  • 首次登录
  • 正常登录
  • 连接被拒绝
    在这里插入图片描述
    首次登录:
    在这里插入图片描述
    正常登录:
    在这里插入图片描述
    3.利用expect完成FTP登录过程
    在这里插入图片描述
    结果:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Cpureman/article/details/107632330