Как дождаться команды в сеансе telnet по сценарию?

Автоматическая отправка файлов через telnet работает нормально. Но как мне заставить telnet «ждать» процесс, который я запустил таким образом, в данном случае nc, который получает файл? Робот здесь в 192.168.0.45, а мой ноутбук в 192.168.0.10.

{
sleep 1
echo "root"
echo "cd /flash"
echo "nc 192.168.0.10 10001 >lasertest"
sleep 5
} | telnet 192.168.0.45 23

Есть несколько подобных вопросов [1], но ни один из них, похоже, не хочет иметь такое синхронное поведение. В примере выше процесс ожидает 5 секунд, просто предполагая, что этого достаточно для передачи. Если он недостаточно длинный, передаваемый таким образом файл будет просто обрезан и поврежден.

[1] Telnet внутри сценария оболочки


person Anne van Rossum    schedule 07.06.2013    source источник


Ответы (1)


Сценарий expect должен подойти.

#!/usr/bin/expect -f
spawn telnet 192.168.0.45 23
expect login
send "root\n"
send "cd /flash\n"
send "nc 192.168.0.10 10001 >lasertest\n"
send "exit\n"
expect eof

Если приглашение для входа не содержит «логин», измените команду «ожидать» соответствующим образом.

person Armali    schedule 10.06.2013
comment
Значит, здесь нужно expect? Как send узнает, что команда завершена? - person Anne van Rossum; 10.06.2013
comment
expect — это инструмент, который делает то, что вам нужно, и не обязательно единственный. - send не знает, что команда завершилась, да и не нужно знать. Достаточно, чтобы вся процедура дошла до конца, а expect eof позаботится об этом. - person Armali; 10.06.2013
comment
Если вы абсолютно хотите дождаться завершения отдельных команд, вы можете чередовать expect с [частью] строки приглашения. - person Armali; 10.06.2013
comment
Да, это сработает, не могли бы вы отредактировать свой ответ, чтобы я мог его принять. В таком виде он не будет ждать завершения nc. - person Anne van Rossum; 11.06.2013
comment
Извините, я понимаю, expect eof уже должен применить это. Я проверю это позже и кроме этого без изменений. - person Anne van Rossum; 11.06.2013
comment
Действительно, с expect eof это прекрасно работает. nc передаст все, а expect аккуратно дождется сигнала EOF, который произойдет только после завершения nc. Небольшая доработка: logout есть не на всех машинах, заменить на exit. - person Anne van Rossum; 14.06.2013
comment
Хороший вопрос... заменили. Небольшое уточнение: EOF происходит только после logout или exit. - person Armali; 17.06.2013