2012-10-19 33 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