文章目录
- 1.免交互的概念
- 1.1什么是免交互
- 2.多行重定向
- 2.1标准格式
- 2.2注意事项
- 2.3示例
- 3. expect免交互 (需要安装)
- 3.1定义
- 3.2 安装
- 3.3命令格式
- 3.4 执行expect脚本
- 3.5 expect相关命令
- 3.5.1 脚本解释器
- 3.5.2 spaw
- 3.5.3 expect
- 3.5.4 send
- 3.5.5 结束符
- 3.5.6 interact
- 3.5.7 set
- 3.5.8 exp_continue
- 3.5.9 send_user
- 4.示例
1.免交互的概念
1.1什么是免交互
交互:
当计算机播放某多媒体程序的时候,编程人员可以发出指令控制该程序的运行,而不是程序单方面执行下去,程序在接受到编程人员相应的指令后而相应地做出反应
从上得知免交互相当于免去了以上步骤实现自动化
2.多行重定向
2.1标准格式
#语法格式
命令<< 标记
....
......
标记
2.2注意事项
- 标记可以使用任意的合法字符(通用的字符是EOF)
- 结尾的标记一定要顶格写,前面不能有任何字符(包括空格)
- 结尾的标记后面也不能有任何字符(包括空格)
- 开头标记前后空格会被省略掉
2.3示例
例1:统计行数
wc -l <<EOF #开始
line 1
line 2
EOF #结束语要和上述一样
例2:编写yum仓库
cat <<EOF
>centos7.repo
3. expect免交互 (需要安装)
3.1定义
是建立在tcl(tool command language)
语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题
3.2 安装
yum install -y expect
3.3命令格式
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
3.4 执行expect脚本
chmod +x 脚本名
#需要执行权限
./脚本名
#以绝对或相对路径执行
3.5 expect相关命令
命令 | 含义 |
---|---|
spawn | 用于生成一个新进程,可以是命令行程序、脚本或其他可运行的文件。 |
send | 用于向交互式进程发送字符串或命令。 |
expect | 用于等待特定的字符串或模式出现在交互式进程的输出中,并作出相应的响应。 |
send_user | 用于向终端的标准输出发送消息。 |
interact | 将控制权交还给用户,使用户可以与交互式进程进行交互。 |
eof | 等待到达文件结束,结束符 |
sleep | 暂停执行一定的时间 |
exit | 退出当前expect脚本 |
exp_continue | 表示允许 expect 继续向下执行指令 |
3.5.1 脚本解释器
expect 脚本中首先引入文件,表明使用的事哪一种shell
#!/usr/bin/expect
3.5.2 spaw
spawn 后面通常跟一个Linux执行命令,表示开启一个会话、进程,并跟踪后续交互信息
ssh 192.168.67.100
3.5.3 expect
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉有swpan启动的进程输出;
用于接受命令执行后的输出,然后和期望的字符串匹配
3.5.4 send
向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加 \r (回车) 或者\ n
方式一:
expect "密码" {send "123123\r"} #同一行
#send部分要有{}
方式二:
expect "密码" #多行
send "123123\r"
#send部分无需{}
方式三:
expect 支持多个分支
expect #只要匹配了其中一个情况,执行相应的send 语句后退出该expect 语句
只匹配一次
expect
{
{"密码1" {send "abc123\r"}
{"密码2" {send "123123\r"}
{"密码3" {send "123456\r"}
}
3.5.5 结束符
expect eof
表示交互结束,等待执行结束,退回到原用户,与spawn对应
3.5.6 interact
执行完成后保持交互状态, 把控制权交给控制台,会停留在目标终端而不是退回到原终端,这时候就可以手工操作了,interact后命令不再起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一台服务器,会一直在目标服务器终端而不会切回原服务器。
注意
expect eof 与 interact 只能二选一
3.5.7 set
expect 默认的超时时间是10秒,通过set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1
set tine out 30
3.5.8 exp_continue
exp_continue附加于某个expect 判断选项之后,可以是该项被匹配后还能继续匹配expect 判断语句内的其他项。exp_continue类似于控制语句的continue语句。表示允许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执行报错
3.5.9 send_user
同echo一样是表示回显命令
4.示例
远程连接后执行命令,然后退出
#!/usr/bin/expect
#!/usr/bin/expect
spawn ssh 192.168.67.101
expect {
"(yes/no)" { send "yes\n";exp_continue }
"password" { send "123123\n" }
#查找相应关键字符串并交互
}
expect "*]#"
send "df -h\r"
#交互成功后所执行命令
expect "*]#"
send "exit 0\r"
#执行完后登出
expect eof
#结束