Shell脚本基础篇——Expect免交互工具
admin
2023-03-05 16:23:18
0次

本次博客结构

  1. Expect概述
  2. Expect安装方法
  3. Expect基本命令
  4. Expect执行方式
  5. Demo实例

Expect概述

expect是一款自动化的脚本解释型的工具。它基于tcl脚本,其运行需要tcl的支持。expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。

在远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。

Expect安装方法

通常系统中不会安装expect,需要手动进行安装

系统为Centos时:

yum install expect -y

Expect基本命令

Timeout:指定超时时间,默认为10s

​ 当timeout -1时代表永不超时

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

​ 通常后面会跟“\r”代表回车换行

Spawn:启动进程,并追踪后续命令

Expect:对进程进行捕捉(只能捕捉spawn启动的进程)

​ 判断上次输出结果里是否包含指定的字符串

Interact:将控制权交回控制台

$argv参数数组:接受从bash传递的参数

​ 参数从0开始,代表第一个参数

Expect执行方式

分为两种主要执行方式:直接在expect解释器中进行执行、结合“<<”下一位的分界符进行嵌入执行。

直接执行
[root@localhost~]#more a.sh
#!/usr/bin/expect       //导入expect解释器
    set timeout 20      //20秒超时时间
    set hostname [lindex $argv 0]       //追加参数0,加载第1位置
    set password [lindex $argv 1]       //追加参数1,加载第2位置
    spawn ssh root@$hostname
    expect {       
            "(yes/no)"                      //捕获关键字
            {send"yes/r";exp_continue}      //输入yes,继续下一步
            "*password"     //参数2
            {send"$password\r"}     //模拟人工输入
    }
interact                               //交回控制权回终端
嵌入执行

这里解释一下“<<”的用法:

​ 当shell看到“<<”的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。

“EOF”与“-EOF”两种分界符的不同:

​ “EOF”没有容错率,一旦结尾的分界符存在空格或者制表符,就会导致脚本报错。

​ “-EOF”有一定的容错率,结尾的分界符可以允许存在制表符。

[root@localhost~]#more b.sh
#!/bin/bash                                       //导入bash解释器
    hostname=$1
    password=$2
    /usr/bin/expect<<-EOF                        //将EOF作为分界符,下面所有操作均停留在当前终端
    spawn ssh root@${hostname}                   //启动进程,开始追踪ssh命令
    expect {
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send"$password\r"}
    }
    expect "*]#"
    send "exit\r"
    expect eof                                 //等待分界符结束
EOF                                            //另一位分界符,代表操作结束
Demo实例

直接执行Demo

#!/usr/bin/expect 

#超时时间  
set timeout 20
log_file test.log 
log_user 1
#参数传入
set hostname [lindex $argv 0]
set password [lindex $argv 1]
#追踪命令
spawn ssh root@$hostname
#捕捉信息并且匹配,免交互执行
expect {
        "Connection refused" exit
        "service not known" exit
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password" 
        {send "$password\r"}
}
#控制权交给控制台执行
interact
exit

效果如下

Shell脚本基础篇——Expect免交互工具

嵌入执行Demo

#!/bin/bash
user=$1
password=$2
#非交互命令放在expect外
useradd $user
#开始进行交互
expect <<-EOF
spawn passwd $user
expect "新的*"
send "${password}\r"
expect "重新*"
send "${password}\r"
expect eof;
EOF
#以上为脚本实际内容

效果如下:

Shell脚本基础篇——Expect免交互工具

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...