Помогите мне управлять Zmodem через SSH с ожидаемым
Есть изящный маленький инструмент под названием zssh, который облегчает использованиеlszrz
утилиты для передачи файлов с использованием zmodem через существующее соединение ssh. Это удивительно удобно... но кажется, что я должен быть в состоянии сделать то же самое, используя expect
, Я получил это далеко...
#!/usr/bin/expect -f
spawn ssh $argv
set ssh_spawn_id $spawn_id
send_user "ssh is: $ssh_spawn_id\n"
interact -o "\030B0000" {
send_user "\nStarting zmodem receive.\n"
spawn rz -v
set rz_spawn_id $spawn_id
send_user "rz is: $rz_spawn_id\n"
while {1} {
expect {
eof break
-i $rz_spawn_id -re .+ {
send -raw -i $ssh_spawn_id $expect_out(buffer)
}
-i $ssh_spawn_id -re .+ {
send -raw -i $rz_spawn_id $expect_out(buffer)
}
}
}
send_user "\nFinished zmodem receive.\n"
set spawn_id $ssh_spawn_id
}
Это запуск rz
увидев ZRQINIT
кадр, и это, видимо, соединяетrz
на сессию SSH, но это не работает. rz
говорит:
Retry 0: Bad CRCe.**B0100000023be50
Retry 0: Bad CRC**B0600000023d984
Retry 0: Bad CRC**B0600000023d984
...и так далее.
Есть ли способ сделать эту работу? Спасибо!
2 ответа
с помощью
exp_internal 1
в то время как отладка чрезвычайно полезна. Вы можете посмотреть, как ожидаемый совпадает с входящим текстом.Интересно, мешает ли терминал. До нереста
rz
, пытатьсяstty raw
, Затем послеsend_user "Finished..."
делатьstty -raw
,Ты можешь использовать
exp_continue
вместоwhile
цикл:spawn rz -v set rz_spawn_id $spawn_id send_user "rz is: $rz_spawn_id\n" expect { -i $rz_spawn_id -re .+ { send -raw -i $ssh_spawn_id $expect_out(buffer) exp_continue } -i $ssh_spawn_id -re .+ { send -raw -i $rz_spawn_id $expect_out(buffer) exp_continue } eof }
Это не имеет ничего общего с проблемой, просто вопрос стиля.
Я обнаружил, что с помощью -e
/ --escape
Параметр (экранировать все управляющие символы) на стороне отправителя помогает при некоторых проблемах с установлением соединения zmodem.
например:
отправка файла:
sz -e somefile.ext
получение файла:
rz -e
Это удобно для передачи файлов по соединению IPMI sol (serial-over-lan).
В OSX есть iterm2-zmodem, а в Linux - Konsole с интеграцией Zmodem.