Shell编程中Expect免交互的示例分析

103次阅读
没有评论

共计 2905 个字符,预计需要花费 8 分钟才能阅读完成。

本篇文章给大家分享的是有关 Shell 编程中 Expect 免交互的示例分析,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

Expect 概述

Expect 是建立在 tcl 基础上的一个工具,Expect 是用来进行自动化控制和测试的工具。主要解决 shell 脚本中不可交互的问题。对于大规模的 Linux 运维很有帮助
在 Linux 运维和开发中,我们经常需要远程登录服务器进行操作,登录过程是一个交互的过程,可能会需要输入 yes/no,password 等信息。为了模拟这种输入,可以使用 Expect 脚本。

基本命令 send:向进程发送字符串,用于模拟用户的输入

该命令不能自动回车换行,一般要加 \r(回车)

expect

expect 的一个内部命令,判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回

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

spawn:启动进程,并跟踪后续交互信息 interact:执行完成后保持交互状态,把控制权交给控制台 Timeout:指定超时时间,过期则继续执行后续指令

单位是:秒

timeout -1 为永不超时

默认情况下,timeout 是 10 秒

exp_continue

允许 expect 继续向下执行指令

send_user

回显命令,相当于 echo

$argv 参数数组

Expect 脚本可以接受从 bash 传递的参数,可以使用 [lindex $argv n] 获得,n 从 0 开始,分别表示第一个,第二个,第三个 … 参数

Expect 脚本必须以 interact 或 expect eof 结束,执行自动化任务通常 expect eof 就够了

expect eof 是在等待结束标志。由 spawn 启动的命令在结束时会产生一个 eof 标记,expect eof 即在等待这个标记

Expect 语法单一分支语法

expect password: {send mypassword\r}

多分支模式语法 send 命令不具备回车换行功能,一般要加 \r 或 \n

expect aaa {send AAA\r}
expect aaa {send AAA\r}
expect aaa {send AAA\r}

只要匹配了 aaa 或 bbb 或 ccc 中的任何一个,执行相应的 send 语句后退出该 expect 语句

expect {
aaa {send AAA\r}
bbb {send BBB\r}
ccc {send CCC\r}
}

exp_continue 表示继续后面的匹配,如果匹配了 aaa,执行完 send 语句后还要继续向下匹配 bbb

expect {
aaa {send AAA\r exp_continue}
bbb {send BBB\r exp_continue}
ccc {send CCC\r}
}

-re 参数表示匹配正则表达式 Expect 执行方式直接执行

SSH 登录
首次登陆
正常登录
连接被拒绝, 可能 ssh 没开, 或端口号不对, 亦或是防火墙限制
没有该连接地址

#!/usr/bin/expect //Expect 二进制文件的路径
#超时时间
set timeout 20 //20 秒等待时间
log_file test.log // 日志文件
log_user 1 // 日志用户
#参数传入
set hostname [lindex $argv 0] // 追加参数 0,统计变量并加载第 1 位置参数
set password [lindex $argv 1] // 追加参数 1,统计变量并加载第 2 位置参数
#追踪命令
spawn ssh root@$hostname // 追踪命令
#捕捉信息并匹配免交互执行
expect { // 捕捉提示信息
  Connection refused  exit // 捕捉到拒接连接信息即退出
  service not konwn  exit // 捕捉到服务为开启信息即退出
  (yes/no)  //  捕捉 yes 或 no 参数
 {send  yes\r exp_continue} // 输入 yes 并继续执行  
  *password  //  捕捉参数  
 {send  $password\r} // 输入密码参数  
#控制权交予控制台
interact // 控制权转交控制台人为输入
[root@localhost ~]# ./expect.sh 192.168.109.132 baby520./
spawn ssh root@192.168.109.132
root@192.168.109.132 s password: 
Last login: Thu Oct 10 16:52:48 2019 from 192.168.109.10
[root@localhost ~]#

Expect 执行方式嵌入执行

#!/bin/bash 
user=$1
password=$2
#非交互命令放 expect 外面
useradd $user
#开始交互
expect  -EOF //Expect 开始标志, 标准性输入, 等同于 stdin
spawn passwd $user
expect  新的 * 
send  $password\r 
expect  重新 * 
send  $password\r 
expect eof;
EOF //Expect 结束语句,EOF 前后不能有空格
[root@localhost ~]# ./expect.sh 192.168.109.132 baby520./
spawn ssh root@192.168.109.132
root@192.168.109.132 s password: 
Last login: Thu Oct 10 17:38:16 2019 from 192.168.109.133
[root@localhost ~]# exit
Connection to 192.168.109.132 closed.

案例 1

创建自定义用户,密码自定义

#!/bin/bash
username=$1
password=$2
useradd $username
/usr/bin/expect  -EOF
spawn passwd $username
expect {
  新的 * 
 {send  $password\r exp_continue}
  重新 * 
 {send  $password\r}
[root@localhost ~]# ./tom.sh test2 123123
spawn passwd test2
更改用户  test2  的密码  。新的   密码:无效的密码:  密码少于  8  个字符
重新输入新的   密码:passwd:所有的身份验证令牌已经成功更新。

案例 2

利用 expect 完成 FTP 登录过程

#!/usr/bin/expect -f
set timeout 20
spawn ftp 192.168.109.133
expect  Name* 
send  ftp\r 
expect  Password:* 
send  \r 
expect  ftp * 
interact
expect eof

以上就是 Shell 编程中 Expect 免交互的示例分析,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2905字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)