2

IPアドレス、ファイルの場所、パスワードを含むファイルがあります。ssh キー認証を使用できないため、bash スクリプト内での使用に制限されています。このファイルには、スペースで区切られた次の情報が含まれています。

IPロケーションパスワード

IPロケーションパスワード

私のスクリプトは次のとおりです。

 VAR=$(expect -c "
        set fid [open "file.conf" w]
        set content [read $fid]
        close $fid
        set records [split $content "\n"]
        foreach rec $records {
        set fields [split $rec]
        lassign $fields\ ip location password
        puts "$ip"
        puts "$location"
        puts "$password"}
        spawn ssh $ip tail -f $location > /home/log_$ip 2>/dev/null &
        expect {
                ".*Are.*.*yes.*no.*" { send "yes\n" }
                "*?assword:*" { send "$password\r" }
           }
    ")

エコー "$VAR"

スクリプトを実行すると、次のエラーが表示されます。

間違った # 引数: "read channelId ?numChars?" のはずです または、「set content [read ]」内から呼び出された「read」の実行中に「read ?-nonewline? channelId」

4

1 に答える 1

1

Expect の本体を一重引用符で囲む必要があるため、expect が実行を開始する前に、expect 変数がシェルによって展開されないようにする必要があります。

また、"are...yes...no" プロンプトが表示されexp_continueた場合は、パスワード プロンプトが表示されるのを待ち続けることができるように、 を使用する必要があります。

「w」を使用して conf ファイルを開かないでください -- ファイルの内容が破壊されます。あなたはそこから読んでいるので、開いて読んでください

VAR=$(expect -c '
    set fid [open "file.conf" r]
    while {[gets $fid line] != -1} {
        lassign [split $line] ip location password
        puts "$ip"
        puts "$location"
        puts "$password"
        spawn ssh $ip tail -n 20 $location > /home/log_$ip 2>/dev/null &
        expect {
            -re "Are.*yes.*no" { send "yes\r"; exp_continue }
            -gl "*?assword:*" { send "$password\r" }
        }
    }
')

スポーン出力をリダイレクトするときにこれが機能するかどうかはわかりません。これでうまくいかない場合は、" > /home/log_$ip 2>/dev/null &" を削除するか、

spawn ssh $ip tail -n 20 $location 2>/dev/null | tee /home/log_$ip

バックグラウンド処理の場合、おそらく次のようなことを行う必要があります(テストされていません)

expect -c '...' > /home/log_$ip 2>&1 &
expect_pid=$!

# ...

# later
wait $expect_pid
VAR=$(< /home/log_$ip)
do something with "$VAR"
于 2013-10-24T16:03:39.370 に答える