Expect的用法详解

一、安装与基本概念

Expect是一个自动交互式任务的工具,可以像我们在终端上手动输入命令一样操作,支持模拟键盘输入及获取输出等等。使用Expect可以方便地实现自动化的交互任务,如自动登录、自动发邮件等等。

Expect本身可以说是一个语言,是基于Tcl语言的,安装之前需要先安装Tcl。

sudo apt-get install tcl

安装完成之后再安装Expect:

sudo apt-get install expect

使用Expect的第一步,就是要让脚本知道我们需要交互的目标。这个目标可以是一个脚本,也可以是一个应用程序。

#!/usr/bin/expect
spawn bash
interact

在这个脚本里,我们使用spawn命令让脚本知道要和哪个程序进行交互,这里使用了bash程序。而后面的interact命令,就告诉脚本让用户来控制后续的操作。

二、使用spawn命令

Spawn命令是Expect中最常用的命令之一,它的作用是启动一个新的进程,并且让你控制这个新进程。

下面是spawn命令的使用方式:

spawn command [args ...]

参数command表示要启动的程序,[args …]表示可选的参数。例如:

#!/usr/bin/expect
spawn ssh user@example.com
expect "password: "
send "mypassword\r"
interact

在这个脚本里,我们使用spawn命令启动一个ssh进程并连接到远程主机。接下来,在expect “password: “后,使用send命令模拟键盘输入,输入密码并回车。最后使用interact命令交还控制权给用户。

三、使用expect命令

Expect命令用于指定脚本等待哪个字符串出现,允许脚本在等待期间执行其他任务,如等待输入、循环、条件判断等等。

下面是expect命令的使用方式:

expect pattern1 {action1} pattern2 {action2} ...

pattern表示需要等待的字符串,可以使用单引号或双引号。action表示待执行的操作,例如模拟键盘输入、打印输出等等。

例如,以下脚本将模拟远程连接,并等待远程主机的输出结果:

#!/usr/bin/expect
spawn ssh user@192.168.1.1
expect "password:"
send "mypassword\r"
expect "$ "
send "ls\r"
expect "$ "
interact

在这个脚本里,我们启动一个ssh进程并连接远程主机,等待”password:”字符串出现并发送密码,然后等待”$ “符号表示远程连接成功,最后输入”ls”命令并等待”$ “符号再次出现。

四、使用set命令

Set命令用于设置变量的值,方便在脚本中调用。

下面是set命令的使用方式:

set variable value

例如:

#!/usr/bin/expect
set user "foo"
set password "bar"
spawn ssh $user@192.168.1.1
expect "password:"
send "$password\r"
interact

在这个脚本里,我们使用set命令设置变量”user”的值为”foo”,变量”password”的值为”bar”。然后在连接远程主机时使用变量$user代替用户名,使用变量$password代替密码。

五、使用if语句

If语句用于根据条件判断执行哪些操作。

下面是if语句的使用方式:

if {condition} {
    action1
} else {
    action2
}

其中,condition是一个条件表达式,action1是条件为真时执行的操作,action2是条件为假时执行的操作。

例如,以下脚本用于判断远程主机是否存在某个目录:

#!/usr/bin/expect
set dir "/home/user"
spawn ssh user@192.168.1.1
expect "password:"
send "mypassword\r"
expect "$ "
send "if [ -d $dir ]; then echo 'yes'; fi\r"
expect "$ "
if {$expect_out(buffer) == "yes"} {
    puts "The directory exists."
} else {
    puts "The directory does not exist."
}
interact

在这个脚本里,我们连接远程主机并发送命令查询目录是否存在。然后,我们使用if语句判断目录是否存在,如果存在则打印”The directory exists.”;如果不存在,则打印”The directory does not exist.”。

六、使用for循环

For循环用于重复执行同一块代码多次。

下面是for循环的使用方式:

for {init;condition;step} {
    action
}

其中,init是初始变量值,condition是循环条件,step是每次循环后的变化方式,action是每次循环要执行的操作。

例如,以下脚本用于遍历一个目录下的文件列表:

#!/usr/bin/expect
set dir "/home/user"
spawn ssh user@192.168.1.1
expect "password:"
send "mypassword\r"
expect "$ "
send "cd $dir\r"
expect "$ "
send "ls\r"
expect "$ "
set filelist $expect_out(buffer)
for {set i 0} {$i < [llength $filelist]} {incr i} {
    set file [lindex $filelist $i]
    puts $file
}
interact

在这个脚本里,我们连接远程主机并发送命令切换到指定目录,然后发送”ls”命令获取目录下的文件列表。接着,我们在for循环中使用lindex命令遍历文件列表,并打印出每个文件的名称。

七、使用while循环

While循环用于多次执行一个操作,直到满足某个条件为止。

下面是while循环的使用方式:

while {condition} {
    action
}

其中,condition是一个条件表达式,action是每次循环要执行的操作。

例如,以下脚本用于等待远程主机上的某个程序启动完成:

#!/usr/bin/expect
set program "/usr/local/bin/myprogram"
spawn ssh user@192.168.1.1
expect "password:"
send "mypassword\r"
expect "$ "
send "nohup $program &\r"
set timeout 30
while {1} {
    expect {
        "$ " {
            break
        }
        "starting $program" {
            sleep 1
        }
        timeout {
            send "\x03"
            puts "Timeout waiting for program to start."
            exit 1
        }
    }
}
interact

在这个脚本里,我们连接远程主机并发送启动某个程序的命令,并等待程序启动完成。我们使用while循环和expect命令来检测程序是否启动,如果启动成功则跳出循环,否则一直等待。如果等待时间超过30秒,则打印错误信息并退出脚本。

八、使用send命令

Send命令用于模拟键盘输入。

下面是send命令的使用方式:

send string

其中,string是要输入的字符串。

例如,以下脚本用于向远程主机发送一个命令:

#!/usr/bin/expect
set command "ls"
spawn ssh user@192.168.1.1
expect "password:"
send "mypassword\r"
expect "$ "
send "$command\r"
expect "$ "
interact

在这个脚本里,我们连接远程主机并发送命令”ls”,使用send命令模拟键盘输入。

九、使用log_file命令

Log_file命令用于记录执行过程中的输出内容。

下面是log_file命令的使用方式:

log_file filename
log_file -noappend filename

其中,filename是日志文件名。

例如,以下脚本用于连接远程主机,并将输出内容保存到日志文件中:

#!/usr/bin/expect
set log_file "expect.log"
spawn ssh user@192.168.1.1
expect "password:"
send "mypassword\r"
expect "$ "
send "ls\r"
expect "$ "
log_file close
interact

在这个脚本里,我们连接远程主机并发送”ls”命令,使用log_file命令将输出保存到日志文件中。最后使用log_file close命令关闭日志文件。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/232236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-11 12:49
下一篇 2024-12-11 12:49

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论