2011-02-16 9 views
3

Там это отличный маленький инструмент под названием zssh, что позволяет легко использовать lszrz утилиты для передачи файлов с использованием zmodem поверх существующей SSH связи. Это удивительно удобно ... но мне кажется, что я должен , чтобы иметь возможность выполнить то же самое, используя expect. Я получил это далеко ...Помоги мне управлять Zmodem через SSH с ожидать

#!/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 

... и так далее.

Есть ли способ сделать эту работу? Благодаря!

+0

Мне любопытно, если вы уже используете ssh, почему бы не передать файл с помощью scp? –

+0

В основном (a) Мне просто интересно понять, что лучше ожидать, и (б) использование scp требует второго соединения, которое может быть или не быть легким (например, если между моим рабочим столом и удаленным система, способная передавать файлы по * существующему * каналу, чрезвычайно удобна). – larsks

ответ

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 
    } 
    

    Это не имеет ничего общего с этой проблемой, только вопрос стиля.

+0

Спасибо за предложения. Я считаю, что при использовании 'взаимодействовать', все работает по умолчанию в режиме« сырой »... в любом случае я добавил явные вызовы' stty' и, похоже, не изменил поведение.Установка 'exp_internal 1', конечно, обеспечивает дополнительную диагностику; Мне нужно будет взглянуть на них более внимательно, чтобы узнать, могу ли я точно сказать, что происходит. – larsks

+0

@larsks, спасибо за принятие. Что решило вашу проблему? –

2

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

, например:

отправки файла:

sz -e somefile.ext 

Получение файла:

rz -e 

Это удобно для передачи файлов через IPMI золь связи (последовательный по локальной сети).

Существует iterm2-zmodem на OSX и Konsole на Linux с интеграцией Zmodem.