У меня есть несколько сценариев для автоматизации процесса, и мне нужно сообщение о том, на каком этапе я нахожусь. в командном окне отображается фрагмент кода, который у меня есть:
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, но ничего не работает. Пожалуйста помогите!!
Возможно, потребуется очистить выходной файл. После каждого ставит
добавляйте строку
flush stdout
См. команду tcl flush. Кроме того, можно установить выходные данные в небуферизованный режим с помощью одной строки:
fconfigure stdout -buffering none
См. tcl fconfigure.
После send "cmd\r"
, expec
t отправляет это 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
отображается при следующем запросе.