2012-10-19 37 views
0

我遇到预期脚本中的send命令问题。 我从来没有使用过期望,所以有这么多的特性,我不知道,主要是关于语法。使用期望发送此命令的终端命令时遇到问题

其实它捕捉cpu使用顺便说一句。

top -n 10 -d 0.01 | awk'BEGIN {FS =“[,%]”; printf“(”}/^ Cpu/{[^ 0-9。,] + /,“”,$ 7); 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 [email protected]$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引号字符串,如外壳采用了单引号:

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 
+0

谢谢。 我用这种方式解决了这个问题,但是你更清洁。 send - “echo -n'MEMORY_FREE:'&& free -t | grep'buffers/cache'| awk'{print \ $ 4 /(\ $ 3 + \ $ 4)* 100}'&& printf'\ n'&& echo -n'CPU_FREE:'&& 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“ – andersonK