使用expect发送此终端命令时遇到问题

时间:2012-10-19 14:10:28

标签: awk grep send expect

我遇到了在expect脚本中发送命令的问题。 我以前从未使用过这个期望,所以我不知道它有很多特点,主要是关于语法。

实际上它捕获了cpu使用量。

  

top -n 10 -d 0.01 | awk'BEGIN {FS =“[,%]”; printf“(”} / ^ Cpu / {   GSUB(/ + / “”,$ 7 ^ 0-9。]); GSUB(/ ^ 3949 / “”,$ 7); printf $ 7“+”}   END {print 0“)/ 10”}'| BC

我想做的是:期待,使用命令send。我想通过脚本传递该字符串。

我正在尝试这种方式:

#!/bin/expect
set timeout 20
set user [lindex $argv 0]
set password [lindex $argv 1]
set host [lindex $argv 2]
set prompt "$ "

;

proc gestat { } {
        ;
        send -- "echo -n 'MEMORY_FREE: ' && free -t | grep 'buffers/cache' | awk '{print \$4/(\$3+\$4) * 100}'\r"
        send -- "top -n 10 -d 0.01 | awk \'BEGIN{FS='[,%]'; printf '(' }/^Cpu/{ gsub(/[^0-9.,]+/,'',\$7); gsub(/^3949/,'',\$7); printf \$7' + '} END{print 0') / 10'}\' | bc\r"

        return
}

;

spawn ssh $user@$host

while (1) {
        expect {
                "(yes/no)? " {
                        send -- "yes\r"
                }

                "password: " {
                        send -- "$password\r"
                }

                "$prompt" {
                        gestat
                        break
                }
        }
}

expect "$prompt"
        send -- "exit\r"

expect eof

但发送不起作用。错误是:

  

命令名称无效“,%”       执行“,%”       (程序“gestat”第4行)

我想这是因为期待“解析器”。但我真的不知道。 抱歉我的英语很差。

1 个答案:

答案 0 :(得分:0)

由于expect是Tcl的扩展,[]字符在双引号字符串中是特殊的。你需要保护它们。

此外,在第二次调用awk时你会遇到麻烦 - 你不能在单引号字符串中嵌入单引号。

你需要使用Tcl的{}引用 - 在Tcl引用字符串中使用大括号,比如shell使用单引号:

send -- {echo -n 'MEMORY_FREE: ' && free -t | grep 'buffers/cache' | awk '{print $4/($3+$4) * 100}'}
send -- \r
send -- {top -n 10 -d 0.01 | awk 'BEGIN{FS="[,%]"; printf "(" }/^Cpu/{ gsub(/[^0-9.,]+/,"",$7); gsub(/^3949/,"",$7); printf $7 " + "} END{print 0 ") / 10"}' | bc}
send -- \r