0

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

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

顶部 -n 10 -d 0.01 | awk 'BEGIN{FS="[,%]"; printf "(" }/^Cpu/{ gsub(/[^0-9.,]+/,"",$7); gsub(/^3949/,"",$7); printf $7" + "} END {打印 0") / 10"}' | 公元前

我想做的是:期望,使用命令发送。我想通过脚本传递那个字符串。

我正在尝试这种方式:

#!/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 行)

我想这将是因为期望“解析器”。但我真的不知道。对不起我糟糕的英语。

4

1 回答 1

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
于 2012-10-19T17:47:26.750 回答