目录
一、交互的概念
交互:当计算机播放某多媒体程序的时候,编程人员可以发出指令控制该程序的运行,而不是程序单方面执行下去,程序在接受到编程人员相应的指令后而相应地做出反应。
对于Linux操作系统中,有许多操作都会触及到交互(根据系统的指示做出相对应的操作满足操作者的需求),对于shell脚本的自动化运维,就要实现免交互来达到自动化运维的效果。
二、免交互
1.Here Document 免交互
使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个“文件”并用作“命令”的标准输入。
Here Document 也可以与非交互式程序和命令一起使用。
1.1 语法格式
命令 << EOF#标记
...
内容
...
EOF#标记
#以什么为标记,就以什么为结束
例:
#!/bin/bash
passwd lisi <<EOF
abc1234
abc1234
EOF
1.2 tee命令重定向输出加标准输出
[root@localhost ~]#tee test2.txt <<EOF
> this is tee test
> EOF
this is tee test
[root@localhost ~]#cat test2.txt
this is tee tset
#tee命令有标准输出的作用,可以直接重定向输入到文件中
1.3 支持变量替换
#!/bin/bash
file="test1.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOF
2.Expect免交互
2.1 expect简述
expect是建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
#系统中需安装expect与tcl软件包
2.2 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:
执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,
比如interact后添加exit,并不会退出root用户。
而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。
2.3 expect 语法格式
spawn 命令 #启动进程,并跟踪后续交互信息
expect "字符" {send "字符"}
#或expect "字符" send "字符"
#或expect "aaa" {send "AAA\r"}
# expect "aaa" {send "AAA\r"}
# expect "aaa" {send "AAA\r"} #多分支语法
#向进程发送字符串,用于模拟用户的输入
#该命令不能自动回车换行,一般要加\r(回车)
expect eof 或 interact
#expect eof:表示交互结束,等待执行结束,退回到原用户,与spawn对应。
#interact:执行完成后保持交互状态,把控制权交给控制台
2.4 示例
ssh免交互连接
#!/usr/bin/expect
spawn ssh root@20.0.0.12
expect {
"(yes/no)" {send "yes\r";exp_continue;
"password" {send "$password\r"}
}
interact