2011-02-16 3 views
3

Il y a un chouette petit outil appelé zssh qui le rend facile à utiliser les lszrz utilitaires pour transférer des fichiers en utilisant zmodem via une connexion ssh existante. C'est étonnamment pratique ... mais il semble que je devrais pouvoir accomplir la même chose en utilisant expect. Je suis devenu loin ...Aidez-moi à conduire Zmodem sur ssh avec attendre

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

Ce démarrage rz après avoir vu un cadre ZRQINIT, et il se connecte apparemment rz à la session ssh, mais il ne fonctionne pas. rz dit:

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

... et ainsi de suite.

Existe-t-il un moyen de faire fonctionner ce système? Merci!

+0

Je suis curieux, si vous utilisez déjà ssh, pourquoi ne pas transférer des fichiers avec scp? –

+0

Principalement (a) Je suis juste intéressé à essayer de comprendre mieux, et (b) l'utilisation de scp nécessite une seconde connexion, ce qui peut être facile ou pas (par exemple, s'il y a plusieurs sauts entre mon bureau et la télécommande système, être capable de transférer des fichiers sur le canal * existant * est extrêmement pratique). – larsks

Répondre

2
  1. en utilisant exp_internal 1 alors que le débogage est extrêmement utile. Vous êtes en mesure d'afficher comment attendre correspond au texte entrant.

  2. Je me demande si le terminal est gênant. Avant de pondre rz, essayez stty raw. Puis après send_user "Finished..." faire stty -raw.

  3. Vous pouvez utiliser exp_continue au lieu d'une boucle 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 
    } 
    

    Cela n'a rien à voir avec le problème, juste une question de style.

+0

Merci pour les suggestions. Je crois que lors de l'utilisation de 'interact', tout fonctionne en mode' raw' par défaut ... en tout cas, j'ai ajouté les appels explicites à 'stty' et cela ne semble pas avoir changé le comportement.La définition de 'exp_internal 1' fournit certainement des diagnostics supplémentaires; Je vais devoir les regarder de plus près pour voir si je peux dire exactement ce qui se passe. – larsks

+0

@larsks, merci pour l'acceptation. Qu'est-ce qui a résolu votre problème? –

2

J'ai trouvé que l'utilisation de l'option -e/--escape (tous les caractères de contrôle) sur le côté de l'expéditeur aide à certains problèmes initiant la connexion zmodem.

par exemple:

envoi de fichier:

sz -e somefile.ext 

fichier reçu:

rz -e 

Ceci est pratique pour transférer des fichiers sur une liaison IPMI sol (série-over-LAN).

Il existe iterm2-zmodem sous OSX et Konsole sous Linux avec intégration de Zmodem.