shell编程 免交互

96 阅读4分钟

Here Document免交互

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

语法格式:

命令 <<标记...

内容 #标记之间是传入内容

...

标记

注意事项:

标记可以使用任意合法字符(通常为EOF)

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

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

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

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

20220908120143.png

免交互修改用户密码

20220908120357.png

cat命令+免交换

20220908120652.png

20220908120814.png

tee命令(同时实现 标准输出+重定向输出)

20220908091800.png

20220908121248.png

20220908121558.png

20220908121705.png

起始标记字符用单引号括起来的话,里面的 $ 将被视为普通字符

起始标记字符前面加 “—” ,可抑制每行行首的制表符tab键

支持变量替换

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

20220913140030.png

20220913140059.png

20220913140629.png

20220913140551.png

20220913141301.png

20220913141333.png

起始标记字符用单引号括起来的话,里面的 $ 将被视为普通字符

起始标记字符前面加 “—” ,可抑制每行行首的制表符tab键

20220913165719.png

多行注释

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

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

20220913165059.png

20220913165120.png

Expect

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

安装软件包:

rpm -q expect

rpm -q tcl

yum install -y expect

基本命令:

(1)脚本解释器

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

(2) spawn

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

(3) expect

判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;

只能捕捉由spawn启动的进程的输出;

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

(4) send

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

(5)结束符

expect eof

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

interact

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

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

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

6、 set 设置会话超时时间

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

例如: set time out 30

7、exp_continue

exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。

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

并行执行,exp_continue 前面的匹配如果有就执行,没有就不执行;但后面的一定会执行。

8、send_users

表示回显命令,相当于echo

9、接收参数

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

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

set password [lindex $argv 1]   相当于 passswd=$$2

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

set password [lindex $argv 1]   相当于 passswd=$$2

案例演示

修改用户密码

20220920144611.png

20220920144922.png

su切换用户

20220920145432.png

20220920145752.png

ssh免交互远程连接

20220920150658.png

20220920150632.png