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中的判断语句:     

  1. if { condition } {
  2.      # do your things
  3. } elseif {
  4.      # do your things
  5. } else {
  6.      # do your things
  7. }

expect中没有小括号(),所有的if/else, while, for的条件全部使用大括号{}, 并且{ 与左边要有空格,否则会报错。另,else 不能单独占一行,否则会报错。
2. 字符串比较

  1. if { "$node" == "apple" } {
  2.      puts "apple"
  3. } elseif { "$node" == "other" } {
  4.      puts "invalid name"
  5.      exit 70
  6. } else {
  7.      puts "asd"
  8. }

对比string,使用==表示相等, !=标示不相等。
3. switch 语句

  1. switch $location {
  2.     "apple" { puts "apple" }
  3.     "banana" { puts "banana" }
  4.     default {
  5.         puts "other"
  6.      }
  7. }

记得左大括号{ 的左边要有空格,否则会报错
4. 读取用户输入

  1. expect_user -re "(.*)\n"
  2. 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. 定义交互命令

    1. # stick control + z in variable
    2. set ControlZ \032
    3. # stick control + c in variable
    4. set ControlC \x03
    5. # define string embedded ctrl-z && tab
    6. set oddword foo\032bar\tgorp

 

posted @ 2016-01-19 10:04  桦沐  阅读(2312)  评论(0编辑  收藏  举报