명령이 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"t expec는 이를 send<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 참조플러시주문하다. 또는 다음 한 줄을 사용하여 출력을 버퍼링되지 않은 모드로 설정할 수 있습니다.

 fconfigure stdout -buffering none

tcl 참조구성.

관련 정보