文章目录
Here Document概述:
- Here Document以标签形式实现面交互的过程
- 使用I/O重定向的方式将命令列表提供给交互式程序
- 使用输入的一种替代品
语法格式:
命令 <<标记
... ##交互内容
...
标记
免交互有两种方式
1.<< EOF的标记模式(适用于简单的交互方式,不能进行精确匹配)
2.expect的方式;选项很多的时候就需要用到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登录过程
结果: