一、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脚本。