Помогите мне управлять 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 ответа

Решение
  1. с помощью exp_internal 1 в то время как отладка чрезвычайно полезна. Вы можете посмотреть, как ожидаемый совпадает с входящим текстом.

  2. Интересно, мешает ли терминал. До нереста rz, пытаться stty raw, Затем после send_user "Finished..." делать stty -raw,

  3. Ты можешь использовать 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.

Другие вопросы по тегам