Shell编程之Expect免交互

Shell编程之Expect免交互

Expect概述

Expect安装

Expect基本命令

Expect执行方式

Expect案例

Expect概述

Expect

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

Expect安装

挂载光盘

制作本地YUM源

执行安装命令

  • yum install expect -y
[[email protected] ~]# yum install expect -y
已加载插件:fastestmirror, langpacks
base                                                            | 3.6 kB  00:00:00
extras                                                          | 2.9 kB  00:00:00
updates                                                         | 2.9 kB  00:00:00
(1/4): extras/7/x86_64/primary_db                               | 152 kB  00:00:00
(2/4): base/7/x86_64/group_gz                                   | 165 kB  00:00:00
(3/4): updates/7/x86_64/primary_db                              | 1.9 MB  00:00:01
...//省略部分内容...
  正在安装    : 1:tcl-8.5.13-8.el7.x86_64                                          1/2
  正在安装    : expect-5.45-14.el7_1.x86_64                                        2/2
  验证中      : 1:tcl-8.5.13-8.el7.x86_64                                          1/2
  验证中      : expect-5.45-14.el7_1.x86_64                                        2/2 

已安装:
  expect.x86_64 0:5.45-14.el7_1                                                        

作为依赖被安装:
  tcl.x86_64 1:8.5.13-8.el7                                                            

完毕!

Expect基本命令

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

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

expect

  • expect的一个内部命令,判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回。
  • 只能捕捉由spawn启动的进程的输出

spawn:启动进程,并跟踪后续交互信息

interact:执行完成后保持交互状态,把控制权交给控制台

Timeout:指定超时时间,过期则继续执行后续指令

  • 单位是:秒
  • timeout -1为永不超时
  • 默认情况下,timeout10

exp_ continue

  • 允许expect继续向下执行指令

send_ user

  • 回显命令,相当于echo

$argv参数数组

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

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

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

Expect语法

单一分支语法

expect "password:" {send "mypassword\r";}

多分支模式语法

expect "aaa" {send"AAA\r"}   //send命令不具备回车换行功能,一般要加\r或\n
expect "aaa" {send"AAA\r"}
expect "aaa" {send"AAA\r"}
expect {
    "aaa" {send "AAA\r"}    //只要配置aaa或bbb或ccc中的任何一个,执行相应的send语句后退出该expect语句
    "bbb" {send "BBB\r"}
    "ccc" {send "CCC\r"}
}
expect {
    "aaa" {send "AAA";exp_continue}       //exp_continue表示继续后面的匹配,如果匹配了aaa,执行
    "bbb" {send "BBB";exp_continue}         完send语句后还要继续向下匹配bbb
    "ccc" {send "CCC"}
}

Expect执行方式

直接执行

  • 使用expect免交互使用ssh远程登录另一台服务器,这里我开启两台Linux服务器。

[[email protected] ~]# vim demo19.sh     //编辑脚本文件
#!/usr/bin/expect                     //expect二进制文件路径
set timeout 5                         //超时时间
log_file tast.log                     //记录日志文件存放位置
log_user 1                            //一个用户
set hostname [lindex $argv 0]         //设定第一个位置参数传递并设置变量名hostname
set password [lindex $argv 1]         //设定第二个位置参数传递并设置变量名password
spawn ssh [email protected]$hostname              //追踪命令
expect {                              //使用expect命令捕捉条件,设定输入信息,进行免交互设置
        "(yes/no)"                    //设定匹配条件
        {send "yes\r";exp_continue}   //条件匹配并输入内容,并继续向下匹配
        "*password"                   //设定匹配条件
        {send "$password\r"}          //条件匹配,引用位置变量输入信息
}
interact                               //完成后将控制权交给控制台
[[email protected] ~]# chmod +x demo19.sh  //给脚本文件添加执行权限
[[email protected] ~]# ./demo19.sh 192.168.144.135 123123    //执行脚本
spawn ssh [email protected]
The authenticity of host ‘192.168.144.135 (192.168.144.135)‘ can‘t be established.
ECDSA key fingerprint is SHA256:B8IsZOFG7FbtVkIK+dMILmo0iA4OEIeVGY0GnnCbXhk.
ECDSA key fingerprint is MD5:c2:d8:09:17:de:6e:ec:07:06:1b:ac:b6:1e:bd:62:09.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.144.135‘ (ECDSA) to the list of known hosts.
[email protected]‘s password:
Last login: Sun Oct 13 23:29:38 2019 from 192.168.144.1     //自动登录服务器
[[email protected] ~]# ifconfig                           //查看服务器IP地址
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.144.135  netmask 255.255.255.0  broadcast 192.168.144.255    //成功登录
        inet6 fe80::a85a:c203:e2e:3f3c  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::ad78:663f:1f02:22e4  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:75:9f:c8  txqueuelen 1000  (Ethernet)
        ...//省略部分内容...

嵌入执行

[[email protected] ~]# vim demo20.sh     //编辑脚本文件
#!/bin/bash
hostname=$1                            //设置位置参数变量
password=$2
/usr/bin/expect <<-EOF          //加载expect功能,EOF前面加“-”是为增加容错性,-EOF 前面的“-"只能容错制表
spawn ssh [email protected]$hostname          符,不能容错空格
expect {
        "(yes/no)"
        {send "yes\r";exp_continue}       //进行免交互配置
        "*password"
        {send "$password\r"}
}
expect "*]#"                              //捕捉内容结尾为“]#”的内容
send "exit\r"                             //匹配后输入exit退出登录
expect eof                                //等待结束标志
EOF                                       //结束标志
[[email protected] ~]# chmod +x demo20.sh    //添加执行权限
[[email protected] ~]# ./demo20.sh 192.168.144.135 123123    //执行脚本,并输入位置变量
spawn ssh [email protected]
[email protected]‘s password:
Last login: Sun Oct 13 23:58:05 2019 from 192.168.144.1
[[email protected] ~]# exit
登出
Connection to 192.168.144.135 closed.
[[email protected] ~]# ifconfig                       //查看IP地址信息
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.144.133  netmask 255.255.255.0  broadcast 192.168.144.255
        inet6 fe80::a85a:c203:e2e:3f3c  prefixlen 64  scopeid 0x20<link>   //成功登出
        ether 00:0c:29:5b:d3:a0  txqueuelen 1000  (Ethernet)
        RX packets 11058  bytes 855440 (835.3 KiB)
        ...//省略部分内容...

原文地址:https://blog.51cto.com/14473285/2442145

时间: 2024-10-11 15:26:01

Shell编程之Expect免交互的相关文章

无标题文章shell编程之Expect免交互

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

Shell编程之Expect免交互语句详解

Expect概述 Expect是建立在tcl基础_上的一个工具,Expect 是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题.对于大规模的linux运维很有帮助.在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入(yes/no)password等信息.为了模拟这种输入,可以使用Expect脚本. Expect安装 yum install expect -y 基本命令 send: 向进程发送字符串,用于模拟用户的输入.

Shll编程之Expect免交互

Shll编程之Expect免交互 1.Expect概述 2.Expect安装(底层语言Tcl) 3.Expect基本命令 4.Expect执行方式 5.Expect案例 Expect概述: 1.Expect是建立在tcl语言基础上的一个工具,Expect是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题.对于大规模的linux运维很有帮助. 2.在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会余姚输入yes/no passwo

Shell脚本之Expect免交互

Expext概述 Expect是建立在tcl基础上的一个工具,Expect是用来自动化控制和测试的工具.主要解决shell脚本中不可交互的问题.有助于大规模的系统运维工作.在日常的运维与开发中,常常需要运城登录到服务器,然而登录的过程却是个需要交互的过程,可能会要输入yes/no等信息,使用Expect脚本即可实现免交互操作. Expect安装 挂载光盘制作本地YUM源执行安装命令yum install expect -y 基本命令 send 向进程发送字符串,用于模拟用户的输入,该命令不能自动

shell编程之array

变量 : 内存空间 类型 shell编程中所有变量类型为字符类型array 数组 数组中变量叫做element (元素) ,数组中每个元素都用索引位置来标注声明数组declare -a ARRAY_NAME赋值方法1 :AA[0]=jerry赋值方法2 :br/>AA={jerry,tom,lucy}数组实例![](https://s1.51cto.com/images/blog/201907/09/d85fa8a4c0a1da0c0a4e8975ba9d285f.png?x-oss-proce

shell编程之case分支语句

shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 如果里面匹配到固定值:或某个变量存在多中取值,需要对其中的每一个取值分别执行不同的命令序列. case只是判断一个变量的不同取值. case的模式: 执行流程: 首先使用"变量值"与模式1进行比较,如果取值相同就执行模式1的命令序列1,直到遇见" ;; "后跳转到es

shell编程之if语句

目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other shell编程之if判断 1.整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a&

expect 免交互配置互信

++++++++++++++++++++++++++++++++++++++++ 标题:expect 免交互配置互信 时间:2020年3月3日 ++++++++++++++++++++++++++++++++++++++++ #/usr/bin/env expect set  ip  192.168.100.100 set  user  root set  password  centos set  timeout  5 spawn ssh-copy-id "${user}@${ip} -p 2

Shell编程——Expect免交互

Expect概述 Expect是建立在tcl基础上的一个工具,Expect是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题.对于大规模的Linux运维很有帮助在Linux运维和开发中,我们经常需要远程登录服务器进行操作,登录过程是一个交互的过程,可能会需要输入yes/no,password等信息.为了模拟这种输入,可以使用Expect脚本. 基本命令 send:向进程发送字符串,用于模拟用户的输入 该命令不能自动回车换行,一般要加\r(回车) expect expect的