Here Document免交互


前言

很多时候我们在输和使用入命令的时候都会需要进行交互,如read命令就是以常见的交互命令,写入脚本的时候交互的命令可能会产生报错信息,因此我们可以将指定的信息直接写入脚本后进行无交互的输入输出,可以最大程度上避免报错问题。


一、概述

使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp、cat或read命令等。
Here Document是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。
特殊字符“<<”在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的stdin,标记的选择要确保不会出现在其他地方,避免出现混淆:两个表级之间的内容被当作是一个文件并用作“命令”的标准输入。另外Here Document也可以与非交互式程序和命令一起使用。

语法格式

语法格式:
命令 <<标记
...
内容    #标记直接是传入内容
...
标记

注意

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

免交互输出

直接将内容写入通过命令行输出
在这里插入图片描述

将输入保存到文件
在这里插入图片描述
追加内容
在这里插入图片描述
本地源的创建
在这里插入图片描述
通过read命令接收输入并打印,输入值是两个EOF标机之间的部分,作为变量a的值
在这里插入图片描述
通过passwd命令给用户设置密码
在这里插入图片描述

变量设定

Here Document 也支持使用变量,如果标记之间有变量被使用,会先替换变量值。如 果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。如果写入 的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入。
在写入文件时现将变量替换成实际值,再结合cat命令完成写入
在这里插入图片描述
在这里插入图片描述
将一个整体赋值给一个变量,然后通过echo命令将变量值打印出来
在这里插入图片描述

格式控制

关闭变量替换的功能,按照字符原本的样子输出,不做任何的修改或替换
在这里插入图片描述
去掉每行之前的tab字符界面

多行注释

• Bash的默认注释是“#”,该注释方法只支持单行注释: Here Document 的引入解决了多行注释的问题

• “:"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量


二、expect

概念

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

[root@localhost ~]# rpm -q expect tcl
package expect is not installed
package tcl is not installed
[root@localhost ~]# yum install expect tcl

相关命令

##脚本解释器,首先引入文件,表明使用的是那一种shell
#!/bin/bash/expect

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

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

expect 从进程接收字符串

判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由spawn启动的进程的输出;用于接收命令执行后的输出,然后和期望的字符串匹配
send 用于向进程发送字符串
向进程发送字符串,用于模拟用户的输入;
该命令不能自动回车换行,一般要加\r (回车)或者\n
exp_continue 匹配多个字符串在执行动作后加此命令
exp_ continue 类似于控制语句中的continue 语句。表示允许expect 继续向下执行指令

expect eof

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

interact 允许用户交互

会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命.令不起作用;比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。使用interact会保持在终端而不会退回到原终端;

set

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

send_users

表示回显命令与echo相同

案例

1、免交互切换用户

#!/usr/bin/expect   ##解释器万分注意
#设置超时时间
	set timeout 5
#参数传入
	set username [lindex $argv 0]
	set password [lindex $argv 1]
#开始追踪命令
	spawn su $username
#免交互执行,捕捉信息并匹配
	expect "密码"
	send "$password\r"
	expect "*]#"
	send_user "ok" 
#把控制权交给控制台
	interact
#expect eof

2、免交互远程登录

#!/usr/bin/expect  #expect自己的解释器
#开启ssh命令,ssh后边要跟IP地址
spawn ssh root@192.168.223.10   #开启一个程序,这个程序是ssh远程>登录
expect {     #捕获内容,当出现password时,机会向程序发送密码
    "password:" {send "123456\r":exp_continue }
    "(yes/no)" { send "yes\r"}
  }
 #expect eof
interact  #交互,否则会直接退出远程服务器

3、scp的免交互

#!/usr/bin/expect
 
spawn scp /etc/passwd 192.168.61.128:/date
expect {
     "yes/no" { send "yes\n";exp_continue }
     "password: " { send "123456\n" }
}
expect eof

总结

当我们执行脚本的时候可以通过免交互的方式来执行,这样的话可以很大程度上减少了很多的麻烦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值