linux下expect的简单使用
expect 可以模拟用户行为做一些shell操作, 如ssh登陆远程服务器, 模拟用户执行ssh命令, 输入密码, 并在远程服务器上操作等
模拟用户开启或重启nginx进程代码:
1 #!/usr/bin/expect -f 2 set n [exec ps -ef | grep nginx | grep -v grep | wc -l] #执行shell命令并将结果赋值给变量n 3 send_user $n #控制台输出n 4 if { $n>=1 } { #条件判断 5 spawn sudo nginx -s reload #执行命令 6 } else { 7 spawn sudo nginx 8 } 9 expect { 10 "*password*" { send "123456a\r" } #输入密码 11 } 12 interact
expect语法参考:
1. expect中的判断语句:
- if { condition } {
- # do your things
- } elseif {
- # do your things
- } else {
- # do your things
- }
expect中没有小括号(),所有的if/else, while, for的条件全部使用大括号{}, 并且{ 与左边要有空格,否则会报错。另,else 不能单独占一行,否则会报错。
2. 字符串比较
- if { "$node" == "apple" } {
- puts "apple"
- } elseif { "$node" == "other" } {
- puts "invalid name"
- exit 70
- } else {
- puts "asd"
- }
对比string,使用==表示相等, !=标示不相等。
3. switch 语句
- switch $location {
- "apple" { puts "apple" }
- "banana" { puts "banana" }
- default {
- puts "other"
- }
- }
记得左大括号{ 的左边要有空格,否则会报错
4. 读取用户输入
- expect_user -re "(.*)\n"
- send_user "$expect_out(1, string)\n"
expect_user -re 表示正则表达式匹配用户按下回车前输入的所有字符
expect_out(1, string) 表示第一个匹配的内容,即回车前所有字符
expect_out(buffer) 所有的buffer内容
5. break && continue
如c中一样,expect一样可以使用break && continue, 并且功能相同。注:只能用在循环中。
6. 定义交互命令
- # stick control + z in variable
- set ControlZ \032
- # stick control + c in variable
- set ControlC \x03
- # define string embedded ctrl-z && tab
- set oddword foo\032bar\tgorp