コマンドがExpectに入力されると、メッセージは順番に表示されません。

コマンドがExpectに入力されると、メッセージは順番に表示されません。

プロセスを自動化するスクリプトがありますが、現在進行中のステップに関するメッセージをコマンドウィンドウに表示したいと思います。次のコードがあります。

puts "** Creation of $VMNAME on $HOST begins... **"
spawn ssh -l $USER $HOST
expect_after eof {exit 0}
set timeout 10

expect "(yes/no)?" { send "yes\r" }
expect "password:" { send "$PASSWORD\r" }
expect "~]#" { send "date\r" }
set timeout 1200

puts "** Transferring rhelvm img file to the $HOST... **"
expect "~]#" { send "scp  somelink/rhelvm-0-vol.img /storage/iso/\r" }
expect "Password:" { send "$TESTEMSPASS\r" }

puts "** Transferring the VM conf from $TESTEMSUSER to $HOST... **"
expect "~]#" { send "scp somelink/$VMNAME.conf /root\r" }
expect "Password:" { send "$TESTEMSPASS\r" }

puts "** Removing the $VMNAME... **"
expect "~]#" { send "/opt/ccm/bin/vmremove -f /root/$VMNAME.conf --force\r" }
sleep 10
expect "~]#" { send "rm -rf /storage/vmpool/*.img\r" }
sleep 10

puts "** Creating the $VMNAME... **"
expect "~]#" { send "/opt/ccm/bin/vmcreate -f /root/$VMNAME.conf -g  /storage/iso/rhelvm-0-vol.img -e\r" }
sleep 10

puts "** Starting the $VMNAME ... **"
expect "~]#" { send "virsh start $VMNAME\r" }
sleep 10

expect "~]#" { send "virsh list --all\r"}

expect "~]#" { send "date\r" }

puts "** Creation of $VMNAME is completed. **"
expect "~]#" { send "exit\r" }

しかし、出力から得られた内容はその順序ではありません。たとえば、仮想マシン作成メッセージを表示してから、rm -rf /storage/vmpool/*.img コマンドを実行します。 -nonewline と send_user を試してみましたが、何も機能しないようです。助けてください! !

答え1

その後、send "cmd\r"texpecsend<CR>SSHプロセスを制御する医師端末装置のマスターに送信します。

sshその後、Aはスレーブ側から読み取らcmd<LF>れ、リモートホストに送信され、最終的にリモートホストに到達し、シェルがそれを再読み込みします。

リモート擬似端末デバイスのシェルまたは行規則は、表示するcmd<CR><LF>メッセージ(仮想入力テキスト)を再送信し、最終的には擬似端末制御のechoためにホストに返送します。expectssh

expectただし、内容は指示に従ってのみ処理されます(出力には以下がssh含まれます)。だからechoexpect

send "cmd\r"
sleep 4
puts "text"
expect "output of ssh" {...}

text出力は今後これエコうんcmd、そうだからエコのみ表示されますexpect

次のことができます。

send "cmd\r"
expect "cmd\r\n" # wait for the echo (or just expect "\n")
sleep 4
puts "text"
expect "output of ssh (next prompt)" {...}

まず、コマンドのエコーを待ちます。または:

send "cmd\r"
sleep 4
expect "output of ssh (next prompt)" {puts "text"; ...}

これにより、text次のプロンプトに表示されます。

答え2

出力ファイルを更新する必要があります。各行putsが追加された後

 flush stdout

tcl リファレンスフラッシュ注文する。または、次の 1 行を使用して、出力をバッファリングされていないモードに設定することもできます。

 fconfigure stdout -buffering none

tcl リファレンス構成

関連情報