您的位置:

Expect脚本详解

一、expect脚本运行顺序

expect脚本是一个脚本语言,它可以让你自动化执行交互式任务,比如执行ssh登录、ftp上传下载等。expect脚本的运行顺序如下:

#!/bin/bash
/usr/bin/expect <

   

我们可以把expect语句看成是在模拟人类在命令行上的操作,比如输入用户名,密码,然后执行命令,最后退出。expect脚本中最核心的命令是spawn和expect,前者是运行一个新的shell进程,并启动一个交互会话;后者用来捕获shell的输出,判断命令执行的状态。

二、expect结束脚本

在很多情况下,我们需要判断expect脚本是否执行成功。一种方法是通过expect eof判断交互过程是否结束,如果结束那么expect命令会返回0,否则会返回一个非零值。我们可以根据这个返回值来判断是否执行成功。

#!/bin/bash
/usr/bin/expect <

     

上面的例子中如果登录成功,那么expect会返回0,脚本退出;否则如果出现"Permission denied",则expect会返回非零值,脚本也会退出。

三、shell脚本expect安装

在很多Linux发行版中,expect命令并不会默认安装。我们需要手动安装才能使用。安装方法如下:

sudo apt-get install expect

如果你的系统中没有apt-get命令,那么可以尝试其他发行版的包管理器,比如yum,dnf,或者直接从源代码编译安装。但这里不再深入讨论,可以参考expect官方文档进行操作。

四、expect的用法

expect命令的基本用法如下:

expect "string"
expect -exact "string"
expect -glob "pattern"
expect -re "regexp"
expect { }

其中,-exact选项表示精确匹配,-glob选项表示通配符匹配,-re选项表示正则表达式匹配,而{}用来包含多个expect命令。在使用的时候,我们可以根据需要选择不同的匹配方式,来准确匹配shell的输出。

五、linux中expect

Linux系统中expect命令的使用非常广泛,尤其是在自动化管理中。可以自动化执行ssh登录、ftp上传下载、telnet等各种任务。举一个简单的ssh登录的例子:

#!/usr/bin/expect -f
set timeout 20
set user [lindex $argv 0]
set passwd [lindex $argv 1]
set host [lindex $argv 2]
set cmd [lindex $argv 3]

spawn ssh $user@$host
expect {
    "(yes/no)*" {
        send "yes\r"
        expect "*password:*"
        send "$passwd\r"
    }
    "*assword:*" {
        send "$passwd\r"
    }
}
expect "$*"
send "$cmd\r"
expect "$*"
send "exit\r"
expect eof

上面的expect脚本使用了spawn命令启动一个新的ssh会话,并通过expect命令匹配输出字符串,来输入用户名和密码。其它的命令依然是通过send和expect命令来执行和捕获。

六、expect命令如何使用

在实际使用中,expect命令有一下几个基本步骤:

1、使用spawn命令启动一个新的交互式会话。

2、使用expect命令匹配输出字符串,并根据输出字符串来输入命令或者密码。

3、使用send命令发送要执行的命令或者字符串。

4、使用expect命令匹配上一条命令的输出,并进行相应的处理,比如判断命令执行是否成功。

5、使用exit命令退出交互式会话,或者通过expect eof命令判断会话是否结束。

七、linux expect用法

在Linux系统中,expect命令的应用非常广泛,特别是在自动化管理中。我们可以使用expect脚本自动执行一些需要交互操作的命令,免去手动操作的繁琐。比如,我们可以用expect来自动安装一些软件包:

#!/bin/bash
#/media/site/update/expect/auto_sudo_gcc5.sh
#use expect to automate entering password
echo $0
function auto_sudo()
{
   expect << EOF
   spawn sudo su -
   expect {
      "*password*" {
         send "$1\r"
      }
   }
   expect "*#"
   send "cd /media/site/program/gcc5\r"
   send "ls -lh\r"
   send "pwd\r"
   send "./install.sh\r"
   send "exit\r"
   expect eof
EOF
}
auto_sudo "password"

上面的expect脚本可以自动安装gcc5,并且自动输入sudo密码,免去了手动输入密码的繁琐。

八、expect的用法shell

expect命令的用法非常灵活,我们可以根据不同的需求来选用不同的匹配方法。在实际使用中,我们也需要结合shell的一些特性来编写expect脚本。比如,我们可以给expect命令设置超时时间,来避免卡顿问题:

#!/usr/bin/expect -f
set timeout 20
spawn ssh user@host
expect "Password:"
send "password\r"
expect {
    ")>" {
        send "command1\r"
        expect ")>"
        send "command2\r"
        expect ")>"
        send "exit\r"
    }
    timeout {
        puts "timeout"
        exit 1
    }
}
expect eof

上面的expect脚本中我们使用了timeout命令来设定expect命令的超时时间。如果超时了,那么会执行timeout后的脚本。