2011-02-16 6 views
3

zssh이라는 멋진 도구가있어서 lszrz 유틸리티를 사용하여 기존 ssh 연결을 통해 zmodem 를 사용하여 파일을 쉽게 전송할 수 있습니다. 그것은 놀랍게도 편리하지만 ... 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 
} 

이것은 ZRQINIT 프레임을 본 후에 rz을 시작하고 ssh 세션에 rz을 연결하지만 분명히 작동하지 않습니다. rz 메시지 :

Retry 0: Bad CRCe.**B0100000023be50 
Retry 0: Bad CRC**B0600000023d984 
Retry 0: Bad CRC**B0600000023d984 

... 등등.

이 방법을 사용할 수 있습니까? 감사!

+0

이미 ssh를 사용하고 있다면 궁금합니다. scp로 파일을 전송하지 않으시겠습니까? –

+0

대부분 (a) 나는 더 나은 것을 이해하려고 노력하는 데 관심이 있습니다. (b) scp를 사용하려면 두 번째 연결이 필요합니다. 쉽지 않을 수도 있습니다 (예 : 바탕 화면과 리모컨 사이에 여러 홉이있는 경우 * 기존 * 채널을 통해 파일을 전송할 수 있다는 것은 대단히 편리합니다.) – larsks

답변

2
  1. exp_internal 1을 사용하면 디버깅이 매우 유용합니다. 수신 텍스트가 어떻게 일치하는지 확인할 수 있습니다.

  2. 터미널이 방해가되는지 궁금합니다. rz을 산란하기 전에 stty raw을 시도하십시오. 그런 다음 send_user "Finished..."stty -raw하십시오.

  3. 당신은 대신 while 루프의 exp_continue를 사용할 수 있습니다

    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

제안 해 주셔서 감사합니다. 'interact'를 사용할 때, 모든 것은 기본적으로'raw' 모드로 동작하고 있다고 믿습니다. 어떤 경우이든,'stty'에 명시 적 호출을 추가했는데 동작을 변경하지 않은 것처럼 보입니다.'exp_internal 1'을 설정하면 확실히 추가적인 진단 기능을 제공합니다; 나는 그들이 무엇이 진행되고 있는지 정확히 알 수 있도록 그들을 더 면밀히 관찰해야 할 것입니다. – larsks

+0

@larsks, 수락을 보내 주셔서 감사합니다. 무엇이 당신의 문제를 해결 했습니까? –

2

나는 송신자 측에서 (모든 제어 문자를 이스케이프) 옵션을 -e/--escape를 사용하여 Z 모뎀 연결을 시작 몇 가지 문제에 도움 것으로 나타났습니다. 예를 들어

:

전송 파일 :

sz -e somefile.ext 

수신 파일 :

rz -e 

이 IPMI 졸 (LAN을 통한 직렬 연결) 링크를 통해 파일을 transfering에 편리합니다.

OSX에는 iterm2-zmodem이 있고 Zmodem 통합에는 Linux의 Konsole이 있습니다.

관련 문제