web-dev-qa-db-ja.com

expect'send 'コマンドを使用しながら出力を変数に格納する方法

ありがとう。

ただし、アカウントとパスワードが必要です。したがって、それらを送信してから、ovs-vsctlコマンドを送信する必要があります。

スクリプトは次のようなものです。

spawn telnet@ip 

expect -re "*login*" {
       send "root"
}

expect -re "password*" {
       send "****"
}

send "ovs-vsctl *******"

このコマンドsend "ovs-vsctl ****"の出力を保存したいのですが、「send "password"」コマンドの出力を何度も取得しましたが、どうすればsend "ovs-vsctl****"の出力を取得できますか。コマンドsend "ovs-vsctl ***の出力は2つの文字列であり、各文字列は1行を占めます。

ありがとう。

8
user3153829

多分:

log_user 0                   ;# turn off the usual output
spawn telnet@ip 
expect -re "*login*"
send "root\r"
expect -re "password*"
send "****\r"
send "ovs-vsctl *******"
expect eof
puts $expect_out(buffer)     ;# print the results of the command
8
glenn jackman

Expectは、インタラクティブアプリケーションから返されるすべてを含む入力バッファで動作します。つまり、プロセス出力および入力の両方を意味します(リモートデバイスからエコーされる限り) 、通常はそうです)。

expectコマンドは、入力バッファーからテキストを回復するために使用されます。一致が見つかるたびに、その一致の最後までのバッファーがクリアされ、$ expect_out(buffer)に保存されます。実際の一致は$ expect_out(0、string)に保存されます。その後、バッファがリセットされます。

あなたの場合にあなたがする必要があるのは、あなたが望むものを得るために、出力をexpectステートメントと一致させることです。

あなたの場合、私がすることは、パスワードを送信した後にリモートデバイスプロンプトを照合し、コマンドが送信された後にもう一度照合することです。そうすれば、最後の一致後のバッファーが必要な出力を保持します。

次のようなもの:

[...]
expect -re "password*" {
       send "****"
}

expect -re ">"

send "ovs-vsctl *******\r"

expect -re ">"  # Better if you can use a regexp based on your knowledge of device output here - see below

puts $expect_out(buffer)

出力の知識に基づいて正規表現を使用して照合することにより、エコーされたコマンド自体ではなく、コマンド出力のみを抽出できるはずです。または、regexpコマンドを使用して、事後にいつでもそれを行うことができます。

お役に立てば幸いです。

5
James