一、Here Document免交互

1、Here Document概述

Here Document 是一个特殊用途的代码块。它在Linux Shell 中使用I/O 重定向的方式将命令列表提供给交互式程序或命令,比如ftp、cat 或read 命令。Here Document 是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。

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

语法格式:

命令 <<标记

...

...

标记

特殊字符“<<"在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的 stdin。

2、Here Document使用注意事项

在实际使用过程中,有四点需要注意。

标记可以使用任意的合法字符;

结尾的标记一定要顶格写,前面不能有任何字符:

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

开头的标记前后的空格会被省略掉。

案例1:用wc -l的命令统计输入的文字的行数

Shell编程与免交互_标准输入

案例2:利用read命令接受输入并打印

Shell编程与免交互_字符串_02

案例3:利用passwd给用户添加密码

Shell编程与免交互_重定向_03

案例4:变量进行替换:在写入文件时回显将变量替换成实际值,再结合cat命令完成写入

Shell编程与免交互_标准输入_04

Shell编程与免交互_字符串_05

案例五:多行注释

Bash 的默认注释是“#”,该注释方法只支持单行注释,在 shell 脚本的工作中,“#”右侧的任何字符串,bash 都会将其忽略。Here Document 的引入解决了多行注释的问题。

Shell编程与免交互_标准输入_06

Shell编程与免交互_字符串_07

上述语法结构中":"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。

案例六:添加多行文本

追加:

Shell编程与免交互_字符串_08

覆盖:

Shell编程与免交互_标准输入_09

二、Expect免交互

1、expect概述

expect 是建立在tcl 语言基础上的一个工具,它可以让一些需要交互的任务自动化地完成,相当于模拟了用户和命令行的交互操作。expect 是用来进行自动化控制和测试的工具。主要解决shell 脚本中不可交互的问题。对于大规模的Linux 运维很有帮助。

建立在tcl之上的一个工具

用于进行自动化控制和测试

解决shell脚本中交互相关的问题

2、expect安装

Linux 系统自身并没有安装expect 和 tcl,需要手动安装。输入“yum -y install expect”命令即可安装。

3、基本命令介绍

(1)脚本解释器

expect 脚本中首先引入文件,表明使用的是哪一个shell,“#!/usr/bin/expect”

(2)expect/send

expect命令用来判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉由spawn 启动的进程的输出。

expect 接收命令执行后的输出,然后和期望字符串匹配,若匹配成功则执行相应的send 向进程发送字符串,用于模拟用户的输入,Send 发送的命令不能自动回车换行,一般要加\r(回车)。其常见语法形式有以下三种。

方式一:

Shell编程与免交互_重定向_10


方式二:

Shell编程与免交互_字符串_11

方式三:

expect 支持多个分支。

Shell编程与免交互_标准输入_12

上述语法结构中$case1 代表检测命令的输出结果,如果输出内容和$case1 一致,通过send 命令模拟用户发送内容到终端。

(3)sqawn

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

Shell编程与免交互_字符串_13

例如,如果想要跟踪切换用户的交互信息,可以执行以下命令。

Shell编程与免交互_字符串_14

(4)结束符

expect eof :等待执行结束,若没有这一句,可能导致命令还没执行,脚本就结束了。

interact: 执行完成后保持交互状态,把控制权交给控制台,这时可以手动输入信息。

需要注意的是,expect eof 与 interact 只能二选一。

(5)set

expect 默认的超时时间是 10秒,通过 set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1。例如执行以下命令即可将超时时间设置为30秒。

(6)exp_continue

exp_continue 表示允许 expect 继续向下执行指令。

(7)send user

send user 表示回显命令,相当于 echo。

4、用expect编写脚本

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

Shell编程与免交互_标准输入_15

Shell编程与免交互_标准输入_16

案例2:创建用户并设置用户密码

Shell编程与免交互_字符串_17

Shell编程与免交互_标准输入_18

案例3:利用expect 完成FTP 的自动登录过程

Shell编程与免交互_标准输入_19

Shell编程与免交互_字符串_20