Команда, вставленная в 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, но ничего не работает. Пожалуйста помогите!!

0
06.03.2017, 18:45
2 ответа

Возможно, потребуется очистить выходной файл. После каждого ставит добавляйте строку

 flush stdout

См. команду tcl flush. Кроме того, можно установить выходные данные в небуферизованный режим с помощью одной строки:

 fconfigure stdout -buffering none

См. tcl fconfigure.

0
28.01.2020, 04:48

После send "cmd\r", expect отправляет это send<CR>на главную сторону псевдотерминального -устройства, которое управляет процессом ssh.

Затем sshсчитывает 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отображается при следующем запросе.

0
28.01.2020, 04:48

Теги

Похожие вопросы