您的位置:

expect用法详解

一、expect用法及搭配

expect是一个用于自动化交互式系统的工具,它可以通过脚本模拟人的交互行为来完成自动化的操作。它通常与spawn(用于启动一个进程)和send(用于向一个进程发送数据)等命令搭配使用。以交互登录操作为例:

#!/usr/bin/expect -f
set timeout 30
spawn ssh username@hostname
expect "password:"
send "yourpassword\r"
expect "#"
send "ls -l\r"
expect "#"
send "exit\r"
expect eof

上述脚本先用spawn命令启动一个ssh会话,然后使用expect命令来匹配返回的结果,如果匹配到了相应的字符串就执行后面的send命令,再匹配下一个字符串,以此类推。最后使用expect eof命令等待连接关闭。

二、expect用法固定搭配

expect还有一些经常搭配使用的命令,比如wait、interact等。

1. wait命令

wait命令可以用于等待子进程执行完成,同时支持超时功能。例如,下面的脚本用于等待子进程执行完成,然后输出相应的消息:

#!/usr/bin/expect -f
set timeout 30
spawn command
wait
puts "command completed"

2. interact命令

interact命令可以让用户在交互登录时自由输入命令。在expect脚本中,交互登录通常需要用户输入用户名和密码,或者需要用户输入其他信息。interact命令可以将控制权交还给用户,让用户自己输入命令。例如:

#!/usr/bin/expect -f
set timeout 30
spawn ssh username@hostname
expect "password:"
send "yourpassword\r"
interact

上述脚本中使用interact命令可以让用户在登录后自由输入命令。

三、expect用法什么意思

除了上面的用法,expect还有其他更多的用途:

1. 自动化测试

expect可以用于自动化测试,它提供了丰富的命令和变量来模拟与被测程序的交互过程。例如,下面的脚本用于测试ftp连接是否正确:

#!/usr/bin/expect -f
set timeout 30
spawn ftp localhost
expect "Name"
send "testuser\r"
expect "Password"
send "testpass\r"
expect "ftp>"
send "ls -l\r"
expect "ftp>"
send "bye\r"
expect eof

2. 邮件自动化

expect可以用于自动发送和接收邮件,自动添加附件等。例如,下面的脚本可以自动发送一封邮件:

#!/usr/bin/expect -f
set timeout 30
spawn /usr/sbin/sendmail -t
expect "Subject:"
send "Test mail\r"
expect "To:"
send "test@example.com\r"
expect "Cc:"
send "test@example.com\r"
expect "From:"
send "test@example.com\r"
expect "Enter mail, end with \".\" on a line by itself:"
send "This is a test mail.\r.\r"
expect "Sent"
send "quit\r"
expect eof

四、expect三个常见的短语

1. spawn id

spawn id是spawn命令返回的一个进程标识符,可以用于与该进程进行交互。例如:

#!/usr/bin/expect -f
set timeout 30
spawn command
expect "Password:"
send "password\r"
expect -re {[^\n]+}
set result $expect_out(0,string)
send "exit\r"
expect eof

2. expect_out

expect_out包含了expect命令匹配的结果信息。例如:

#!/usr/bin/expect -f
set timeout 30
spawn command
expect "Password:"
send "password\r"
expect -re {[^\n]+}
set result $expect_out(0,string)
send "exit\r"
expect eof
puts "result: $result"

3. expect_before、expect_after

expect_before和expect_after分别表示匹配字符串之前和匹配字符串之后的文本内容。例如:

#!/usr/bin/expect -f
set timeout 30
spawn ssh username@hostname
expect {
    "password:" {
        send "yourpassword\r"
        expect "Welcome"
        puts "login success"
    }
    "Connection refused" {
        puts "connection failed"
    }
}
expect eof

五、expect的三种用法

expect有三种常见的用法:字符串匹配、正则匹配和超时处理。

1. 字符串匹配

字符串匹配是比较简单的匹配方式,它可以匹配固定的字符串。例如:

#!/usr/bin/expect -f
set timeout 30
spawn ssh username@hostname
expect "password:"
send "yourpassword\r"
expect "Welcome"
send "exit\r"
expect eof

2. 正则匹配

正则匹配可以匹配更加灵活的字符串,支持通配符、字符类等特殊字符。例如:

#!/usr/bin/expect -f
set timeout 30
spawn ssh username@hostname
expect {
    "password:" {
        send "yourpassword\r"
        expect -re ".*(Welcome).*"
        puts "login success"
    }
    "Connection refused" {
        puts "connection failed"
    }
}
expect eof

3. 超时处理

超时处理用于处理expect命令匹配超时的情况。例如:

#!/usr/bin/expect -f
set timeout 30
spawn ssh username@hostname
expect {
    "password:" {
        send "yourpassword\r"
        expect "Welcome"
        puts "login success"
    }
    timeout {
        puts "timeout"
        exit 1
    }
    eof {
        puts "connection closed"
    }
}
expect eof

六、expect用法和例句

下面是一些实际应用场景中常见的expect用法和例句。

1. 判断命令执行结果,并根据结果执行不同的操作

#!/usr/bin/expect -f
set timeout 30
spawn command
expect {
    "success" {
        puts "command executed successfully"
    }
    "failed" {
        puts "command execution failed"
    }
}
send "exit\r"
expect eof

2. 匹配多个字符串,按顺序执行多个操作

#!/usr/bin/expect -f
set timeout 30
spawn command
expect {
    "password:" {
        send "yourpassword\r"
        expect "Welcome"
        send "ls -l\r"
        expect "success"
        send "exit\r"
        expect eof
    }
    "connection refused" {
        puts "connection failed"
        exit 1
    }
}

3. 交互式输入指令,输入命令后自动执行

#!/usr/bin/expect -f
set timeout 30
spawn telnet localhost 23
expect "login:"
send "username\r"
expect "Password:"
send "password\r"
expect ">"
interact

七、expect用法总结

expect是一个功能强大的工具,用于自动化交互式操作系统和应用程序。它提供了丰富的命令和变量,可以实现各种自动化任务。expect的基本用法包括字符串匹配、正则匹配和超时处理等。更复杂的使用场景需要使用更多的expect命令和语法。

八、expect用法与区别

expect与其他自动化工具相比,有以下几个优点:

1. 支持交互式操作

expect可以直接操作交互式应用程序,比如ssh、telnet等,可以实现自动化登录等操作。

2. 支持多种匹配方式

expect支持字符串匹配、正则匹配等多种匹配方式,可以根据不同的场景灵活选择。

3. 可以使用TCL脚本语言编写

TCL是一种简单易学的脚本语言,可以快速编写复杂的expect脚本。