Aidez-moi à conduire zmodem sur ssh avec attendre
-
14-11-2019 - |
Question
Il y a un petit outil astucieux appelézssh qui facilite l'utilisation dulszrz
Utilitaires pour transférer des fichiers à l'aidezmodemsur 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 allé aussi loin ...
#!/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
}
Cette démarrage rz
Après avoir vu un ZRQINIT
cadre, et il se connecte apparemmentrz
à la session SSH, mais cela 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 cela? Merci!
La solution
utilisant
exp_internal 1
Bien que le débogage soit extrêmement utile. Vous pouvez voir comment attendre correspond au texte entrant.Je me demande si le terminal gêne. Avant de reproduire
rz
, essayerstty raw
. Puis aprèssend_user "Finished..."
faisstty -raw
.Vous pouvez utiliser
exp_continue
au lieu d'unewhile
boucle: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.
Autres conseils
J'ai trouvé que l'utilisation -e
/ --escape
(Échapper à tous les caractères de contrôle) L'option du côté de l'expéditeur aide à certains problèmes qui initient la connexion ZMODEM.
par exemple:
Fichier d'envoi:
sz -e somefile.ext
Fichier de réception:
rz -e
Ceci est pratique pour transférer des fichiers sur le lien IPMI Sol (Serial-Over-LAN).
Il y a ITERM2-ZMODEM sur OSX et Konsole sur Linux avec l'intégration ZMODEM.