0

コマンドsendinexpectスクリプトに問題があります。私はこれまでexpectを使用したことがないので、主に構文についてはわからないほど多くの特殊性があります。

実際には、CPU使用率をキャッチします。

top -n 10 -d 0.01 | awk'BEGIN {FS = "[、%]"; printf "("} / ^ Cpu / {gsub(/ [^ 0-9。、] + /、 ""、$ 7); gsub(/ ^ 3949 /、 ""、$ 7); printf $ 7 "+"} END {print 0 ")/ 10"}'| 紀元前

私がやりたいのは、expectを使用して、コマンド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行目)

「パーサー」を期待しているからだと思います。しかし、私は本当に知りません。英語が下手でごめんなさい。

4

1 に答える 1

0

expectはTclの拡張であるため、[]文字は二重引用符で囲まれた文字列では特殊です。それらを保護する必要があります。

さらに、awkの2回目の呼び出しで問題が発生します。一重引用符で囲まれた文字列に一重引用符を埋め込むことはできません。

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