Shell编程之免交互(Here Document免交互、Expect基本命令)

目录

前言

一、Here Document免交互

1.1 Here Document 概述

1.2 Here Document 使用注意事项

1.3  Here Document常规用法

1.3.1  Here Document 免交互

1.3.2  Here Document变量设定 

 1.3.3 Here Document格式控制

1.3.4  多行注释

二、 Expect  

2.1  Expect概述

2.2 Expect安装

2.3  Expect基本命令

2.3.1 脚本解释器

2.3.2  spawn

2.3.3 expect

2.3.4 send

2.3.4 结束符

2.3.5   set

2.3.6  exp_continue

2.3.7  send usr

2.3.8  接收参数

2.4 Expect语法

2.4.1  单分支语法

2.4.2 多分支语法

2.5 使用expect  编写脚本

三、总结


前言

shell脚本存在的核心意义就在于基于shell命令简化甚至省略可避免的人工操作,通过各种控制流程结构以及正则表达式等方法,逐步实现自动化操作的整个过程,由此也可见,shell并没有面向对象的思想,类似C语言,毕竟C语言是操作系统或者说是内核的核心语言。所以,语言并无优劣之分,只是每个人使用的习惯与方式不同,换句话说,难易的不是语言,而是思想与突如其来的灵感。

一、Here Document免交互

Here document (here-document, here-text, heredoc, hereis, here-string, here-script)是一个文件文字或输入流文字:它是源代码文件的一部分,被视为它是一个单独的文件。该术语还用于使用类似语法,保留换行符和文本中的其他空格(包括缩进)的多行字符串文字形式。

1.1 Here Document 概述

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

标准输入的一种替代品

语法格式:

命令 <<标记   #自定义
...
...
标记     #自定义

注:特殊字符“<<”在标记和命令之前,可以将命令块地输出重定向到程序或命令地stdin。标记地选择要确保不会出现在其他地方,避免出现混淆;两个标记之间地内容被当作是一个文件并用作“命令”的标准输入。另外Here Document  也可以与非交互程序和命令一起使用。

1.2 Here Document 使用注意事项

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

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

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

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

扩展:有两种写法:

①:cat <<EOF>1.txt

②:使用tee 命令  :  tee  1.txt  <<EOF

1.3  Here Document常规用法

先发起,交代动作命令;后免交互输入的值

1.3.1  Here Document 免交互

通过read命令接收输入并打印

使用免交互给用户设置密码

1.3.2  Here Document变量设定 

变量替换

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

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

 1.3.3 Here Document格式控制

 关闭变量替换功能

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

去除每行之前的TAB字符

开头标记定格写入,在前面加上’-’,对之后赋值内容中出现的Tab间隔自动去除影响

1.3.4  多行注释

Bash的默认注释是“#”,该注释方法只支持单行注释;在shell脚本工作中, “#”右侧的任何字符,bash将会忽略掉;Here Document 的引入解决了多行注释的问题。
 “:"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。

 1.通过Here Document方式使Bash支持多行注释

2.语法格式:

<<  EOF
第一行注释
第二行注释
....
EOF
案例:

 结果只会输出exec   string

二、 Expect  

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

2.1  Expect概述

建立在tcl(基本语言工具)之上的一个工具

用于进行自动化控制和测试(屏幕捕捉)

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

2.2 Expect安装

1.挂载光盘
2.制作本地YUM源
3.执行安装命令

yum -y install expect

rpm -qa | grep expect

rpm -qa | grep tcl

2.3  Expect基本命令

2.3.1 脚本解释器

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

2.3.2  spawn

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

2.3.3 expect

判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由spawn启动的进程的输出:
用于接收命令执行后的输出,然后和期望的字符串匹配

2.3.4 send

向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一-般要加\r (回车)或者\n
例:
方式一:
expect "密码" {send "abc123\r"}  #同一行send部分要有{}
 
方式二:
expect "密码"
send "abc123\r"                    #换行send部分不需要有{}
 
方式三:
expect支持多个分支
 
expect         #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
 
{
"密码1" {send "abc123\r"}
"密码2" {send "123456\r"}
"密码3" {send "123123\r"}
}
 

2.3.4 结束符

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

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

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

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

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

2.3.5   set

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

例: set timeout 30

2.3.6  exp_continue

exp_ continue附加于某个expect 判断项之后,可以使该项被匹配后,还能继续匹配该expect 判断语句内的其他项。exp_ continue类似于控制语句中的continue 语句。表示允许expect 继续向下执行指令。
 
例如:下 例将判断交互输出中是否存在yes/no或*password。 如果匹配yes/no则输出yes 并再次执行判断;如果匹配*password。
 
则输出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执行报错

2.3.7  send usr

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

2.3.8  接收参数

Expect脚本可以接受从bash传递的参数
可以使用[lindex $argv n]获得
n从0开始,分别表示第一个,第二个,第三个…参数
/bin/bash的位置变量是   从$1开始到$9结束
Expect[lindex $argv 0]    相当于/bin/bash的$1

扩展: 免交互三个重点

spawn       追踪输入的指令

expect       捕捉输入指令后出现的会话

send          根据捕捉不同的会话来发送对应的指令

2.4 Expect语法

2.4.1  单分支语法

expect "password:"{send "123456\r";}

send命令不具备回车换行功能,一般要加\r或\n

2.4.2 多分支语法

方法一:

expect{
    "aaa"{send"AAA\r"}
    "bbb"{send"BBB\r"}
    "ccc"{send"CCC\r"}
}
只要匹配到了其中任何一个,执行对应的send语句后就退出该expect语句

方法二:

expect{
    "aaa"{send"AAA\r";exp_continue}
    "bbb"{send"BBB\r";exp_continue}
    "ccc"{send"CCC\r"}
}
exp_continue表示继续后面的匹配,
如果匹配到了aaa,执行完send语句后还要继续向下匹配bbb

2.5 使用expect  编写脚本

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

验证:使用 #! /usr/bin/expect   一定要设置权限chmod  +x   ssh.sh

示例二:如果想要在对方的主机上进行一下操作在退出,可以执行下面的脚本

定义引用变量

用set 关键字定义变量,变量名和变量的值中间用空格分开

示例:引用位置变量

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

示例:ssh 免交互的另一种写法

嵌入执行模式,将expect 过程融入shell 当中,方便执行和处理

在shell 脚本中调用expect 

示例:创建用户,并设置密码

或者使用另一种方式

示例: 实现ssh 远程登录的几种情况

找不到服务器时,是这种状态

 连接失败时,是这种状态

三、总结

本文主要介绍了Here Document 和expect实现免交互的作用以及结合实际案例讲解使用方式的具体操作过程。

1. Here Document 概述和  Here Document 用法

2. expect  基本命令和expect 基本语法

1.#!/usr/bin/expect -re:告诉操作系统脚本里的代码使用那一个shell来执
-re 表示启用正则表达匹配
 2. set timeout -1 
设置超时时长 -1 代表永不过期,默认时10秒
 3. exp_continue
表示循环匹配。匹配到改关键字后继续从头开始匹配。若不加exp_continue则会直接退出
 4. expect eof
匹配结尾 例如执行命令结束时则可以匹配到 eof
 5. exit、interact
exit交互结束退出
interact表示执行完后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了
 6. exp_send/send
都是向程序发送字符串,可以理解为输入
7. send_user
send_user 命令用来把后面的参数输出到标准输出中去,默人的send、exp_send 命令都是将参数输出到程序中去的,
8.如何使用
mac 上直接使用 ./XX.sh 执行上述脚本不行。需要使用 expect XX.sh 才能正确执行
 9.调试
expect -d XX.sh输出每次执行的过程可以用于编写脚本时调试之用
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值