web-dev-qa-db-fra.com

Comment obtenir un fichier à un hôte quand tout ce que vous avez est une console de série?

Lorsque tout ce que vous avez est une console série (disons via Telnet via un serveur Terminal Server), quelles méthodes peuvent être utilisées pour transférer des fichiers dans/sorti d'un hôte?

Couper/pâte fonctionne pour les petites choses/imprimables et j'ai joué avec une combinaison d'uuencode/uudecode (avec gzip) gérer les imputables mais tout est très limitant.

22

Les programmes de console série¹ que vous utiliserez à l'autre extrémité de la connexion auront un moyen d'envoyer un fichier à la télécommande. Comment vous allez-y exactement dépend des ressources disponibles sur le système distant.

J'ai lrzsz ou Kermit sur le côté distant

Le cas le plus simple est que si vous avez un programme de transfert de fichiers binaires solide installé sur le côté distant tel que lrzsz ou Kermit . C'était une fois plus commun qu'aujourd'hui, mais votre système particulier pourrait encore en avoir un.

Le programme de console série que vous utilisez du côté local a presque certainement un moyen de télécharger Zmodem ou Kermit, ce qui vous permet d'envoyer tout ce dont vous avez besoin directement.

Dans le cas de Zmodem, il suffit de taper rz sur le système distant, qui envoie une chaîne spéciale que le terminal de série local doit comprendre, ce qui lui entraîne une boîte de dialogue de sélection de fichiers.

Kermit est un protocole plus simple, vous devez donc commencer le transfert manuellement dans ce cas.

Je n'ai pas de programme de transfert de fichiers binaires, mais j'ai uuencode/base64

Il existe plusieurs avantages à utiliser un programme de transfert de fichiers binaires approprié comme lrzsz ou Kermit: efficacité, checkinguming, tentatives automatiques, reprise de transfert avorté, transfert de fichiers multiples, etc., mais celles-ci sont luxe . Si vous n'avez besoin que d'envoyer un fichier ou que vous envoyez des fichiers rarement, vous pouvez vous éloigner avec ASCII téléchargements.

Parce que Terminal Protocoles Interpréter de nombreuses valeurs d'octets qui se produisent dans un fichier de données binaires, vous ne pouvez pas envoyer le fichier directement via la même connexion; Si vous le faites, le code d'émulation de terminal sur l'une des deux extrémités essaiera d'interpréter certaines des données, de corrompre les données et probablement déroutant le code de manutention terminal.

Vous vous entourez autour de cela en codant sur les données binaires dans un sous-ensemble sûr de ASCII du côté local, puis en revenant en des données binaires brutes sur le côté distant. C'est ce que le uuencode et base64 Les programmes font, différent uniquement dans les choix d'algorithmes mineurs.

Sur le système local, vous encodez le fichier: ²

$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz

Ensuite, vous tapez cette commande sur le système distant et envoyez le fichier à l'aide de la fonction de téléchargement de la console de série locale "ASCII":

$ cat | uudecode

Lorsque le téléchargement de fichier finit, frappez Ctrl-C sortir de cat. Vous avez maintenant votre fichier décodé sur le système distant, comme vous le souhaitez.

mais j'ai beaucoup Fichiers à envoyer et imprimable ASCII transcodage est une douleur!

Ce n'est pas difficile à bootstrap vous-même jusqu'à un niveau de technologie plus élevé. Si le système distant comporte un compilateur C, vous pouvez utiliser la technique antérieure pour envoyer le système distant une copie de lrzsz code source. Sur le côté local:

$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz

Ensuite, sur le système distant, tapez ceci via le programme de console série:

$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally

Après avoir démarré la première commande, effectuez un "UPLOAD ASCII" du lrzsz.tgz.uue Fichier sur le système distant. Le pipeline accepte les données ueucodées et la décode à une citagie binaire pour vous, que vous pouvez décompresser et construire.

mais je n'ai pas de compilateur C sur le système distant

Si vous n'avez même pas de compilateur sur le système distant, vous pouvez cross-compile le programme rz (ou autre) programme sur le système local et envoyez-le au système distant à l'aide de la technique ci-dessus.


Notes de bas de page:

  1. minicom , picocom , Putty , Vandyke CRT ...

  2. Vous devez donner le nom du fichier d'entrée à cette version de uuencode deux fois, une fois pour nommer la source des données d'entrée, puis pour déclarer ce que le système distant doit appeler le fichier lorsqu'il décode les données à une sortie. déposer. Vous pouvez éventuellement vouloir que le système distant ait un nom différent pour son fichier de sortie.

    Votre version locale de uuencode peut se comporter différemment.

13
Warren Young

Peut-être que vous devriez donner minicom un essai.

5
elmarco

Je ne sais pas si cela fonctionnerait si tout ce que vous aviez était une console de série, mais si vous avez un accès réseau, vous pouvez utiliser nc(1) pour copier des fichiers à l'aide de TCP/IP.

# WARNING: Depending on your setup, this could make your system unbootable
[email protected] # nc -l 8675 | dd of=/dev/sdXXX
roo[email protected] # dd if=/dev/sdYYY | nc destination-box.local 8675

Dans l'exemple ci-dessus, j'ai cloné sdbYYY à partir d'une zone source à sdaXXX de la boîte de destination. Mon choix de 8675 pour A TCP Numéro de port était arbitraire; vous pouvez utiliser n'importe quel port que vous avez accès. Et il ne doit pas nécessairement être un fichier; il peut être n'importe quel fichier.

[email protected] $ nc -l 12345 >> ~/.ssh/authorized_keys
[email protected] $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345

Dans le deuxième exemple, j'ai copié ma clé publique RSA (~/.ssh/id_rsa.pub) Et l'a ajouté au fichier de clés autorisé de l'hôte cible.

5
Kevin M

J'utiliserais Kermit , le grand-parent des programmes de filtransfer. Nous avons utilisé cela déjà longtemps avant qu'il y ait Linux.

2
txwikinger