ありがとう。
ただし、アカウントとパスワードが必要です。したがって、それらを送信してから、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行を占めます。
ありがとう。
多分:
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
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
コマンドを使用して、事後にいつでもそれを行うことができます。
お役に立てば幸いです。