Помогите мне управлять Zmodem через SSH с ожидаемым - PullRequest
4 голосов
/ 16 февраля 2011

Есть отличный маленький инструмент под названием 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 ]

3 голосов
/ 10 марта 2014

Я обнаружил, что использование опции -e / --escape (экранировать все управляющие символы) на стороне отправителя помогает при некоторых проблемах с установлением соединения zmodem.

например:

отправляющий файл:

sz -e somefile.ext

принимающий файл:

rz -e

Это удобно для передачи файлов по соединению IPMI sol (serial-over-lan).

Есть iterm2-zmodem в OSX и Konsole в Linux с интеграцией Zmodem.

2 голосов
/ 17 февраля 2011
  1. с использованием exp_internal 1 во время отладки чрезвычайно полезно.Вы можете видеть, как ожидаемый соответствует входящему тексту.

  2. Интересно, мешает ли терминал.Перед нерестом rz попробуйте stty raw.Затем после send_user "Finished..." do stty -raw.

  3. Вы можете использовать exp_continue вместо while loop:

    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
    }
    

    Это не имеетвсе, что связано с проблемой, просто вопрос стиля.

...