我遇到了在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行)
我想这是因为期待“解析器”。但我真的不知道。 抱歉我的英语很差。
答案 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