Comment obtenir un fichier sur un hôte alors que vous n'avez qu'une console série?

21

Lorsque tout ce que vous avez est une console série (par exemple via telnet via un serveur de terminaux), quelles méthodes peuvent être utilisées pour transférer des fichiers vers / depuis un hôte?

Le copier / coller fonctionne pour les petites choses / imprimables et j'ai joué avec une combinaison uuencode / uudecode (avec gzip) pour gérer l'imprimable mais c'est très limitant.

Stephen Paul Lesniewski
la source
Compte tenu de certains commentaires que vous avez laissés sur la disponibilité des utilitaires, il serait utile que vous puissiez nommer la plate-forme et / ou décrire l'environnement dans lequel vous vous trouvez. Sinon, vous obtiendrez le stock Kermit / XMODEM / YMODEM / ZMODEMk via les réponses du terminal ...
Avery Payne
Je passe la majeure partie de ma journée derrière Solaris box. Donc en ces termes, si tout ce que vous aviez était SUNCreq (ou peut-être SUNWCuser), quelle serait votre réponse?
Stephen Paul Lesniewski
avec à peine 5 ans de retard,: P Maintenant vous pouvez accepter ma réponse, parce que c'était exactement ce que vous vouliez ... mais probablement pas besoin aujourd'hui.
JM Becker

Réponses:

13

Les programmes de console série¹ que vous utiliserez à l'autre extrémité de la connexion auront un moyen d'envoyer un fichier du côté distant. La façon dont vous vous y prenez dépend des ressources dont vous disposez sur le système distant.

J'ai lrzszou kermitdu côté distant

Le cas le plus simple est si vous avez un programme de transfert de fichiers binaires solide installé sur le côté distant tel que lrzszou kermit. C'était une fois de plus courant 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 d'effectuer un téléchargement Zmodem ou Kermit, qui vous permet d'envoyer tout ce dont vous avez besoin directement.

Dans le cas de Zmodem, tapez simplement rzsur le système distant, qui envoie une chaîne spéciale que le terminal série local doit comprendre, ce qui fait apparaître une boîte de dialogue de sélection de fichiers.

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

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

Il y a plusieurs avantages à utiliser un programme de transfert de fichiers binaire approprié comme lrzszou kermit: efficacité, somme de contrôle, relances automatiques, reprise de transfert avortée, transfert de fichiers multiples, etc., mais ce sont des luxes . Si vous n'avez besoin d'envoyer qu'un seul fichier, ou si vous envoyez rarement des fichiers, vous pouvez vous en sortir avec les téléchargements ASCII.

Étant donné que les protocoles de terminal interprètent 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 à chaque extrémité essaiera d'interpréter certaines des données, corrompant les données et prêtant à confusion également le code de gestion du terminal.

Vous pouvez contourner ce problème en encodant les données binaires en un sous-ensemble sécurisé d'ASCII du côté local, puis en les reconvertissant en données binaires brutes du côté distant. C'est ce que font les programmes uuencodeet base64, ne différant que par des 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 "Téléchargement ASCII" de la console série locale:

$ cat | uudecode

Une fois le téléchargement du fichier terminé, appuyez sur Ctrl-Cpour sortir cat. Vous avez maintenant votre fichier décodé sur le système distant, comme vous le vouliez.

Mais j'ai beaucoup de fichiers à envoyer, et le transcodage ASCII imprimable est pénible!

Il n'est pas difficile de s'initier à un niveau de technologie plus élevé. Si le système distant possède un compilateur C, vous pouvez utiliser la technique antérieure pour envoyer au système distant une copie du lrzszcode source. 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, saisissez ceci via le programme de la 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 "téléchargement ASCII" du lrzsz.tgz.uuefichier sur le système distant. Le pipeline accepte les données uuencodées et les décode en un tarball 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 compiler de manière croisée le programme rz(ou autre) sur le système local et l'envoyer au système distant en utilisant 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 uuencodedeux fois, une fois pour nommer la source des données d'entrée, et encore pour déclarer ce que le système distant doit appeler le fichier lorsqu'il décode les données dans un fichier de sortie. On peut imaginer que le système distant ait un nom différent pour son fichier de sortie.

    Votre version locale de uuencodepeut se comporter différemment.

Warren Young
la source
Fantastique, j'espérais que cette question avait une réponse mentionnant kermit! +1;)
Tim
C'est une bonne réponse, j'aime bien cette section "Mais je n'ai pas". Malheureusement, cela s'arrête à des trucs assez pop et ne va pas vraiment en profondeur. Créer des fichiers exécutables binaires pour différentes architectures à partir de codes ASCII uniquement? Voici pour bootstrap: retrocomputing.stackexchange.com/questions/4672/…
pfalcon
5

Fondamentalement, vous devez utiliser des méthodes pré-Internet pour transférer sur un terminal série, et vous devez avoir un moyen de recevoir le transfert de l'autre côté. De toute évidence, la meilleure façon de le faire est d'utiliser ZMODEM, ce qui signifie que vous devez avoir un outil comme szdéjà à la réception. Cependant, cela n'est pas toujours possible, par exemple, lorsque la cible de réception est un routeur sans réseau.

La seule façon possible d'effectuer ce transfert est directement sur le canal, en utilisant un terminal sécurisé ASCII, dans un style propre pré-8 bits. Je vais utiliser des outils plus modernes qui, je l'espère, sont installés sur la plupart des systèmes.

Expéditeur:

D'abord, nous encodons notre fichier

base64 file.tar.gz > file.tar.gz.b64

Maintenant, assurez-vous que votre commande com send-file est, ascii-xfrc'était ma ligne de commande de connexion

picocom -f n -p n -d 8 -b 115200  --send-cmd "ascii-xfr -snv" /dev/ttyS0

Normalement, nous voulons ascii-xfrdu côté de la réception, mais comme nous ne l'avons pas, cela -nfonctionne en maintenant des terminaisons de ligne correctes.

Destinataire:

Maintenant que nous sommes connectés, allez dans le répertoire où vous souhaitez que le fichier reçu.

cd /tmp/
cat > file.tar.gz.b64

Sur picocom, je viens de CTRL + a + s , et entrez le chemin complet du fichier que j'envoie. Une fois le transfert terminé, vous devrez CTRL + c pour le casser cat.

Maintenant, nous décodons le fichier,

base64 -d file.tar.gz.b64 > file.tar.gz

Faites tout ce que vous pouvez pour vérifier que le fichier est IDENTIQUE à celui que vous avez envoyé, car un transfert ASCII n'a aucune protection de somme de contrôle. Ma boîte de réception avait sha512sum, mais toute commande de somme de contrôle suffirait. Une fois que vous avez confirmé manuellement la correspondance des sommes, vous pouvez supposer que le transfert a réussi!

JM Becker
la source
(Et deux ans plus tard ...) d'après mon expérience dans le transfert de fichiers sur des systèmes qui fusionnent les fins de ligne (merci Microsoft!), L'encodage / décodage base64 ne se soucie pas du style de fin de ligne. \r\nou tout simplement les \ndeux fonctionnent même s'ils sont "fixes" en cours de route. Je ne me souviens pas si c'est dans la norme base64 ou juste les outils que j'ai utilisés, mais je soupçonne que c'est en fait un comportement standard.
Andrew Henle
5

Vous devriez peut -être essayer minicom .

elmarco
la source
Cela ne nécessite-t-il pas quelque chose comme «sx» ou «sz» sur l'hôte source?
Stephen Paul Lesniewski
4
Non, minicom gère ses propres fichiers xfers. sx, sy, sz et rx, ry, rz sont des programmes distincts, généralement trouvés dans des packages nommés à juste titre lszrz ou quelque chose. Bien que je suggère d'utiliser sz et rz. Petit, simple et il fait ce qu'il fait. Minicom est un émulateur de terminal complet.
reiche
4
Cette réponse n'est pas correcte. Minicom génère lrzsz pour les transferts de fichiers. Minicom ne peut pas et ne gère pas ses propres transferts de fichiers.
Jonathan Cline IEEE
5

Je ne sais pas si cela fonctionnerait si vous n'aviez qu'une console série, mais si vous avez un accès réseau, vous pouvez utiliser nc(1)pour copier des fichiers en utilisant TCP / IP.

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

Dans l'exemple ci-dessus, j'ai cloné sdbYYYd'une zone source vers sdaXXXla zone de destination. Mon choix de 8675 pour un numéro de port TCP était arbitraire; vous pouvez utiliser n'importe quel port auquel vous avez accès. Et il n'est pas nécessaire que ce soit un appareil; il peut s'agir de 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' ai ajoutée au fichier de clés autorisées pour l'hôte cible.

Kevin M
la source
5
Puis-je suggérer un grand panneau d'avertissement rouge au-dessus de votre première idée? Une âme solitaire avec le cœur à apprendre pourrait exécuter quelque chose comme ça dans l'espoir de copier uniquement des fichiers, sans lire le paragraphe suivant bien sûr :)
reiche
2

J'utiliserais kermit , le grand-parent des programmes de transfert de fichiers. Nous l'avons utilisé bien avant Linux.

txwikinger
la source
ahh oui .. Je m'en souviens, mais dans ce cas, kermit n'est pas installé sur l'hôte source.
Stephen Paul Lesniewski