2

以下のスクリプトに問題があります。

proc checkUser {userip} {
    set search "show users | include "
    set search_cmd [concat $search $userip]
    exp_send "$search_cmd\r"

    expect {
        -re "Vi.*" {

            set oui "uei.opennms.org/services/passiveServiceStatus"
            set host "localhost"
            set iface "--interface $userip"
            set service "--service Test"
            set parm1 "--parm 'passiveNodeLabel [getNodeName $userip]'"
            set parm2 "--parm 'passiveIpAddr $userip'"
            set parm3 "--parm 'passiveServiceName Test'" 
            set parm4 "--parm 'passiveStatus Up'"

            send_user [ exec perl /opt/opennms/bin/send-event.pl $oui,$host,$iface,$service,$parm1,$parm2,$parm3,$parm4 ]
            #send_user [ exec [pwd]]

        }
    }
}

Expect スクリプト全体はエラーなしで実行されますが、呼び出された perl スクリプトは実行されないようですが、同じ引数を使用して bash で perl スクリプトを実行すると、想定どおりに動作します。

Expect内からperlスクリプトを呼び出すのは正しい方法ですか?

前もって感謝します。

4

1 に答える 1

3

記述されたプログラムは、パラメーターをコンマで区切られた1つの大きな引数としてPerlスクリプトに渡します。これは一般的に合法ですが、Perlプログラムが望んでいることではないかもしれません。代わりに、値がTclレベルで個別の引数になり、Perlレベルでも個別のコマンドライン引数になるように、間にスペースを入れてください。

exec perl /opt/opennms/bin/send-event.pl $oui $host $iface $service $parm1 $parm2 $parm3 $parm4

さらに、Tcl変数ごとに複数の引数があり、それらの中でシェル引用符を使用しようとしているようです。それはさらに間違っています。次のようなコードを書く方がはるかに良いでしょう:

expect {
    -re "Vi.*" {
        set oui "uei.opennms.org/services/passiveServiceStatus"
        set host "localhost"

        send_user [ exec perl /opt/opennms/bin/send-event.pl $oui $host \
                --interface $userip \
                --service "Test" \
                --parm "passiveNodeLabel [getNodeName $userip]" \
                --parm "passiveIpAddr $userip" \
                --parm "passiveServiceName Test" \
                --parm "passiveStatus Up" ]
    }
}

各パラメーターワードは、Tcl内の独自のワードです。物事を明確にするために、バックスラッシュ改行を入れました。置換を処理しながらスペースを埋め込むことができるように二重引用符を使用しますが、何か奇妙なものが必要な場合は、{中かっこを入れる}か、円記号を使用してください。

于 2013-01-08T09:58:32.410 に答える