Shell 免交互

目录

一、Here Document

1. 定义

2. 语法格式  

3. 注意事项

4. 实例演示

4.1 使用标记结尾

4.2 对行数进行统计

4.3 给变量赋值

4.4 免交互设置密码

4.5 变量替换

4.6 关闭变量替换的功能

4.7 去掉每行之前的 TAB 字符

4.8 多行注释

二、expect

1. 定义

2. 格式

3. 基本命令

(1)脚本解释器

(2)spawn

(3)expect

(4)send

(5)exp_continue

(6)expect eof

(7)interact 允许用户交互

(8)set

(9)send_users

(10)接收参数

4. 应用实例

4.1 远程ssh脚本

4.2 创建用户并设置用户密码


一、Here Document

1. 定义

使用I/O重定向的方式将命令列表提供给交互式程序

标准输入的一种替代品

Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准输入,Here Document 可以与非交互式程序和命令一起使用

2. 语法格式  


命令<<   标记

....

......

标记

3. 注意事项

  1. 标记可以使用任意的合法字符(通用的字符是EOF)

  2. 结尾的标记一定要顶格写,前面不能有任何字符(包括空格)

  3. 结尾的标记后面也不能有任何字符(包括空格)

  4. 开头标记前后空格会被省略掉

  5. 单引号 变量双引号 —

4. 实例演示

4.1 使用标记结尾

4.2 对行数进行统计

 

4.3 给变量赋值

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

第一个输入的值会生效

4.4 免交互设置密码

4.5 变量替换

4.6 关闭变量替换的功能

对标记加单引号,即可关闭变量替换

4.7 去掉每行之前的 TAB 字符

EOF前面添加“-”能够去掉行首的tab制表符

4.8 多行注释

  • Bash 的默认注释是“#”,该注释方法只支持单行注释,在 Shell 脚本的工作中,“#”右侧的任何字符串,bash 都会将其忽略。
  • “ : ”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。

二、expect

1. 定义

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

2. 格式

expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
如果系统无命令 需要先从公共yum源安装

expect中相关命令

  • spawn 启动新的进程(监控,捕捉)

  • expect 从进程接收字符串

  • send 用于向进程发送字符串

  • exp_continue 匹配多个字符串在执行动作后加此命令

  • interact 允许用户交互expect eof

3. 基本命令

(1)脚本解释器

expect 脚本中首先引入文件,表明使用的事哪一种shell

#!/usr/bin/expect

(2)spawn

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

例: spawn passwd root

(3)expect

判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉有swpan启动的进程输出;

用于接受命令执行后的输出,然后和期望的字符串匹配

(4)send

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

(5)exp_continue

匹配多个字符串在执行动作后加此命令

exp_ continue 类似于控制语句中的continue 语句。表示允许expect 继续向下执行指令

(6)expect eof

表示交互结束,等待执行结束,退回到原用户,与spawn对应

比如切换到root用户,expect脚本默认的是等待10s当执行完命令后,默认停留10s后,自动切回了原用户

(7)interact 允许用户交互

会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命.令不起作用;

比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。

使用interact会保持在终端而不会退回到原终端;

(8)set

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

例子: set time out 30

(9)send_users

表示回显命令与echo相同

(10)接收参数

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

set hostname [lindex $argv 0]       #相当于 hostname=$1
set password [lindex $argv 1]        #相当于 password=$2

#expect直接执行,需要使用 expect 命令去执行脚本

4. 应用实例

4.1 远程ssh脚本

4.2 创建用户并设置用户密码


版权声明:本文为GaLiCHaoFan1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。