Linux学习之expect操作详解

 更新时间:2022年10月13日 08:47:03   作者:Mrwhite86  
expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。本文将通过示例详细说说它的使用,感兴趣的可以了解一下

一、expect安装介绍

1.expect命令安装

安装语句:yum install expect

2.expect命令含义

expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

3.expect使用场景

(1)并根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您

(2)远程连接设备并执行自动化操作

(3)主要是一些需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具

二、expect使用原理

1.原理介绍:

spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出

2、spawn命令介绍:

spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的、

3、send命令介绍:

send命令接收一个字符串参数,并将该参数发送到进程,这个过程类似模拟人类输入密码

4、interact命令介绍:

结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令

三、expect使用语法

1. expect 启用选项:

  • -c 执行脚本前先执行的命令,可多次使用
  • -d debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
  • -D 启用交换调式器,可设一整数参数。
  • -f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
  • -i 交互式输入命令,使用"exit"或"EOF"退出输入状态
  • -- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --
  • -v 显示expect版本信息

2.expect命令参数:

  • spawn 交互程序开始,执行后面的命令或程序。需要进入到expect环境才可以执行,不能直接在shell环境下直接执行
  • set timeout n 设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。如果设置为-1表示不会超时
  • set 定义变量
  • $argv expect脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推
  • expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互;否则等待timeout秒后自动退出expect语句
  • send 如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查
  • exp_continue 表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。
  • exit 退出expect脚本
  • expect eof spawn进程结束后会向expect发送eof,接收到eof代表该进程结束
  • interact 执行完代码后保持交互状态,将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上
  • puts 输出变量

四、expect使用举例

1.expect脚本实现ssh自动登录远程服务器

#!/usr/bin/expect

spawn ssh mrswhite@192.168.37.9
expect "*password:"
send "test20221007\r"
expect "*#"
interact

expect expect_demo1.sh 执行查看运行结果:

2.expect脚本实现ssh自动登录远程服务器(通用脚本,手动输入参数)

#!/usr/bin/expect

if {$argc < 3} {
    puts "Usage:cmd <host> <username> <password>"
    exit 1
}

set timeout -1
set host [ lindex $argv 0 ]
set username [ lindex $argv 1 ]
set password [ lindex $argv 2 ]


spawn ssh  $username@$host
expect "*password*" {send "$password\r"}
interact

./expect_demo2.sh 192.168.37.9 mrswhite  test20221007  执行查看运行结果:

3.在shell 中嵌套expect

通过expect嵌套shell使用语句在shell内直接执行,任何这样可以实现更多的功能

#!/bin/bash
user="mrswhite"
host="192.168.37.9"
password="test20221007"
/usr/bin/expect << EOF
set time 20
spawn ssh $user@$host
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect "*#"
send "pwd\r"
expect "*#"
send "df -h\r"
expect "*#"
send "exit\r"
interact
expect eof
EOF

五、expect相关错误处理

1.invalid command name "/usr/bin/expect"

解决方案:此时是使用bash脚本嵌套了expect代码,所以执行采用以下两种方式都可以

./expect_demo3.sh
sh expect_demo3.sh

2.invalid command name ":" 转义问题

 解决方案:send里面的内容中的括号[]有问题,不能使用[],将其去除或者添加转义字符

send "cat 20221007.txt | awk -F : '{print $2}'"
send "cat 20221007.txt | awk -F \[:\] '{print $2}'\r"

以上就是Linux学习之expect操作详解的详细内容,更多关于Linux expect的资料请关注脚本之家其它相关文章!

相关文章

  • shell脚本如何读取properties文件中的值

    shell脚本如何读取properties文件中的值

    这篇文章主要给大家介绍了关于shell脚本如何读取properties文件中值的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • Shell编程中while与for的区别及用法详解

    Shell编程中while与for的区别及用法详解

    在shell编程中经常用到循环,常用的循环有for和while循环两种。while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别
    2016-02-02
  • Shell实用技巧:快速去除字符串中的空格

    Shell实用技巧:快速去除字符串中的空格

    这篇文章主要介绍了Shell实用技巧:快速去除字符串中的空格,本文给出了3种方法,分别讲解了删除行首空格、删除行末空格、删除所有空格等内容,需要的朋友可以参考下
    2014-11-11
  • 浅谈:linux cron 计划任务常用符号小结

    浅谈:linux cron 计划任务常用符号小结

    本文给大家介绍linux cron计划任务常用符号小结,感兴趣的朋友跟着小编一起学习吧
    2015-10-10
  • shell两个文件去重的多种姿势

    shell两个文件去重的多种姿势

    最近在利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率。下面这篇文章就给大家分享了利用shell实现两个文件去重的多种姿势,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • Apache服务器的安装步骤(图文教程)

    Apache服务器的安装步骤(图文教程)

    下面小编就为大家带来一篇Apache服务器的安装步骤(图文教程)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Shell脚本中判断输入参数个数的方法

    Shell脚本中判断输入参数个数的方法

    这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数,需要的朋友可以参考下
    2014-10-10
  • Shell脚本实现进度条的两种方式

    Shell脚本实现进度条的两种方式

    本文主要介绍了Shell脚本实现进度条的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Shell脚本制作的终端会话回放功能脚本分享

    Shell脚本制作的终端会话回放功能脚本分享

    这篇文章主要介绍了Shell脚本制作的终端会话回放功能脚本分享,本文分两个文件,Record.sh是用来记录你所执行的命令和屏幕的输出的,而Replay.sh是用来回放Record.sh所录制的内容的,需要的朋友可以参考下
    2014-11-11
  • Xshell全局去除提示音图文方法详解

    Xshell全局去除提示音图文方法详解

    这篇文章主要为大家介绍了Xshell全局去除提示音图文方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论