プロセスを自動化するスクリプトがありますが、現在進行中のステップに関するメッセージをコマンドウィンドウに表示したいと思います。次のコードがあります。
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"
texpec
はsend<CR>
SSHプロセスを制御する医師端末装置のマスターに送信します。
ssh
その後、Aはスレーブ側から読み取らcmd<LF>
れ、リモートホストに送信され、最終的にリモートホストに到達し、シェルがそれを再読み込みします。
リモート擬似端末デバイスのシェルまたは行規則は、表示するcmd<CR><LF>
メッセージ(仮想入力テキスト)を再送信し、最終的には擬似端末制御のecho
ためにホストに返送します。expect
ssh
expect
ただし、内容は指示に従ってのみ処理されます(出力には以下がssh
含まれます)。だからecho
expect
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
次のプロンプトに表示されます。