0
点赞
收藏
分享

微信扫一扫

47、shell 脚本详解(十)-----Here Document 免交互及 expect自动化交互

IT程序员 2022-03-11 阅读 75

一、Here Document 免交互

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

1、格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SbyQWs5T-1646408787662)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645027773701.png)]

2、注意事项

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

3、免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给wc -l 来统计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibGxo9uH-1646408787664)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645027895364.png)]

4、通过read 命令接收输入并打印,输入值是两个EOF标记之间的部分,作为变量 i 的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFRCIi5o-1646408787664)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645027983718.png)]

5、通过passwd给用户设置密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkO1wKJe-1646408787665)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028074604.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMMgcOz1-1646408787665)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028374579.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RgvGJF0P-1646408787665)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028390667.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCLc5pb6-1646408787665)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028598500.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7emmqCuO-1646408787666)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028645392.png)]

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

给EOF 加个 单引号‘ ’

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5Ojnm3O-1646408787666)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028713869.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0zlVU7d-1646408787666)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028723706.png)]

9、去掉每行之前的TAB字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7yjFmHUF-1646408787667)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028793764.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OGK1rrVE-1646408787667)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028805106.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ke5U7r07-1646408787667)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645028988317.png)]

10、多行注释

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OhNkLd0B-1646408787668)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645029084953.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DR2qzIBt-1646408787668)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645029097460.png)]

二、Expect 自动化交互

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

1、基本命令

脚本解释器

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

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

​ (1) 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;

​ (2) 只能捕捉由spawn启动的进程的输出;

​ (3)用于接收命令执行后的输出,然后和期望的字符串匹配。
send

​ 向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加 \r(回车)或者 \n。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJvd5jNG-1646408787668)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645029499133.png)]

结束符:

  • expect eof

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

  • interact

​ 1、执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了。interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。

​ 2、使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;
比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。

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

set

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

​ exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。exp_continue 类似于控制语句中的 continue 语句。表示允许 expect 继续向下执行指令。

例如:下例将判断交互输出中是否存在 yes/no 或 * assword。如果匹配 yes/no 则输出 yes 并再次执行判断;如果匹配 * password 则输出 abc123 并结束该段 expect 语句。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJ1EGedM-1646408787669)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645029872146.png)]

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

send_user

​ send_user 表示回显命令,相当于 echo 。

接收参数

​ expect 脚本可以接受从bash命令行传递的参数,使用[lindex $argv n]获得。其中n从0开始,分别表示第一个,第二个,第三个…参数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aiavWNsr-1646408787669)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645084063885.png)]

2、直接执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LOLvJFt-1646408787669)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645030108509.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wUOLOVUS-1646408787670)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645030132453.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gOJrLFAb-1646408787670)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645030167242.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YCvG9CcJ-1646408787670)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645077648172.png)]

3、嵌入执行模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qxPciwdH-1646408787671)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645078336505.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UbhDh1AB-1646408787671)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645078358929.png)]

4、例题1:实现SSH免交互自动登录

嵌入式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56zGPzV1-1646408787671)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645083809997.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eox0XouO-1646408787671)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645083829363.png)]

直接连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXuFxzBG-1646408787672)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645083857571.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4yjRhv8-1646408787672)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645083871545.png)]

5、例题2:免交互放肆实现创建磁盘分区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySQ9m0iv-1646408787672)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645083543148.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l39k9J6h-1646408787673)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645083559148.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5KY4Ske-1646408787673)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645083662012.png)]

6、补充案例

用expect编写脚本

例1、ssh无交互登录到远程服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTiRtlxY-1646408787673)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645086602727.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Rh7LRrZ-1646408787674)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645086717413.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AMpiV2RI-1646408787674)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645086693696.png)]

例2,操作之后退出操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFalIooH-1646408787674)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645086940262.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xWpYl7KT-1646408787675)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645103517442.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i3oyp9rT-1646408787675)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645103535188.png)]

7、定义和引用变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4Frz6jl-1646408787675)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645103901504.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayPixVzs-1646408787676)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645103923670.png)]

还可以定义其他参数,例如超时时间,日志等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Brl8URzE-1646408787676)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645105298588.png)]

免交互的另一种写法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLrkZfuu-1646408787676)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645105327206.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jYHMYUF7-1646408787677)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645105450528.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zn7nGS12-1646408787677)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645105610957.png)]

8、嵌入执行模式 调用expect

例1 、创建用户并设置用户密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqrlzeBz-1646408787677)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645106166968.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zoM7JzH8-1646408787678)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645105831844.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHjFhnH0-1646408787679)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645106066688.png)]

例2、ssh远程到服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UP9gXAmE-1646408787679)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645106346084.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pg3HbukH-1646408787679)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645106361333.png)]

3、利用expect 完成FTP登录过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wAjfiLwU-1646408787680)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645106619144.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KW3NLFrs-1646408787680)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645106785076.png)]

100机器 systemctl start vsftpd 然后检查状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6afgBfT3-1646408787681)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645107213761.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yIYS4Hxq-1646408787681)(C:\Users\XTC\AppData\Roaming\Typora\typora-user-images\1645107323049.png)]

登录过程**

[外链图片转存中…(img-wAjfiLwU-1646408787680)]

[外链图片转存中…(img-KW3NLFrs-1646408787680)]

100机器 systemctl start vsftpd 然后检查状态

[外链图片转存中…(img-6afgBfT3-1646408787681)]

[外链图片转存中…(img-yIYS4Hxq-1646408787681)]

举报

相关推荐

0 条评论