EOF免交互和expect免交互

概述

Here Document 免交互
使用I/O重定向的方式将命令列表提供给交互式程序,标准输入的一种替代品

语法格式

命令  <<标记
...				#标记之间是传入内容
...
标记

注意事项:

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

举例

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

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

  3. 通过 passwd 给用户设置密码
    在这里插入图片描述

  4. 支持变量替换
    在这里插入图片描述
    在这里插入图片描述

  5. 整体赋值给变量
    在这里插入图片描述
    在这里插入图片描述

  6. 关闭变量替换的功能
    在这里插入图片描述
    在这里插入图片描述

  7. 去掉每行之前的 TAB 字符
    在这里插入图片描述
    在这里插入图片描述

  8. 多行注释
    在这里插入图片描述
    在这里插入图片描述

expect

概述

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

基本命令

  1. 脚本解释器
    expect 脚本中首先引入文件,表明使用的是哪一个 shell。
#!/usr/bin/expect
  1. spawn
    spawn 后面通常跟一个命令,表示开启一个会话、启动进程,并跟踪后续交互信息。
spawn passwd root
  1. expect
    判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由spawn启动的进程的输出;用于接收命令执行后的输出,然后和期望的字符串匹配

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

  3. 结束符
    expect eof:
    表示交互结束,等待执行结束,退回到原用户,与spawn对应,比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户
    interact:
    执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。
    注意:expect eof 与 interact 只能二选一!

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

set timeout 30
  1. exp_continue
    exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。exp_continue 类似于控制语句中的 continue 语句。
下例将判断交互输出中是否存在 yes/no 或 *assword。如果匹配 yes/no 则输出 yes 并再次执行判断;如果匹配 *assword 则输出 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 执行报错
  1. send_user
    send_user 表示回显命令,相当于 echo

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

示例

ssh

  1. 直接使用expect
    在这里插入图片描述
    在这里插入图片描述
  2. 嵌入执行
    在这里插入图片描述
    在这里插入图片描述

创建用户并设置密码

在这里插入图片描述
在这里插入图片描述

实现 ssh 自动登录

在这里插入图片描述
在这里插入图片描述

创建磁盘分区并格式化

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ItookapillinNJ/article/details/114915051
今日推荐