shell编程之免交互

目录

一、Here Document免交互

二、Here Document常规用法

2.1 Here Document免交互

2.2 变量设定(支持变量替换)

2.3 格式控制

2.4 多行注释

三、Expect基本命令

3.1 expect概述

3.2 基本命令

四、Expect执行方式

4.1 用expect编写脚本

4.2 定义和引用变量

4.3 引用位置变量

五、Expect案例

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

5.2 ssh远程到服务器

5.3 实现ssh自动登录

5.4 利用 expect 完成 FTP 登录过程


一、Here Document免交互

Here Document 概述

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

基本语法格式:

命令 <<标记
...
...
...
标记

注:

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

注意事项

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

 举例:

二、Here Document常规用法

  • Here Documen免交互
  • 变量设定(支持变量替换)
  • 格式控制
  • 多行注释

2.1 Here Document免交互

示例一:

通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,也就是“10”,这将作为变量 a 的值

示例二:

通过 passwd 给用户设置密码

2.2 变量设定(支持变量替换)

示例一:

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

示例二:支持变量替换

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

示例三:

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

2.3 格式控制

示例一:关闭变量替换功能

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

示例二:去掉每行之前的TAB字符

在第一行的标记前面加‘-’,这个表示要抑制各行首 TAB 的作用

2.4 多行注释

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

示例一:

多行注释 以 :开头的Here Document标记内容不会被执行

三、Expect基本命令

3.1 expect概述

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

3.2 基本命令

  • 脚本解释器
  • spawn
  • expect
  • send
  • 结束符expect eof/interact
  • set
  • exp_continue
  • send user
  • 接收参数(位置变量)

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

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

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

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"}

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

interact

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

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

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

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执行报错  

注:表示允许用户进行交互操作,一直保持会话连接

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

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

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

四、Expect执行方式

4.1 用expect编写脚本

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

例二:登录后执行操作再退出

4.2 定义和引用变量

用set关键字定义变量,变量名和变量的值中间用空格分开,其他用法与shell脚本一致

4.3 引用位置变量

还可以定义其他参数,例如超时时间,日志等
#超时时间
set timeout 20   //登陆超时多少秒退出
#开启日志文件
log_file test.log   //日志记录操作
#显示信息
log_user 1   //1为屏幕输出信息,0为不输出

五、Expect案例

嵌入执行模式,将expect过程融入Shell 当中,方便执行和处理
在shell脚本中调用expect

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

5.2 ssh远程到服务器

5.3 实现ssh自动登录

5.4 利用 expect 完成 FTP 登录过程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值