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.
solaris
console
serial-console
Stephen Paul Lesniewski
la source
la source
Réponses:
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
lrzsz
oukermit
du côté distantLe cas le plus simple est si vous avez un programme de transfert de fichiers binaires solide installé sur le côté distant tel que
lrzsz
oukermit
. 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
rz
sur 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
lrzsz
oukermit
: 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
uuencode
etbase64
, ne différant que par des choix d'algorithmes mineurs.Sur le système local, vous encodez le fichier: ²
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:
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
lrzsz
code source. Côté local:Ensuite, sur le système distant, saisissez ceci via le programme de la console série:
Après avoir démarré la première commande, effectuez un "téléchargement ASCII" du
lrzsz.tgz.uue
fichier 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:
minicom , picocom , PuTTY , VanDyke CRT ...
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, 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
uuencode
peut se comporter différemment.la source
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
sz
dé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
Maintenant, assurez-vous que votre commande com send-file est,
ascii-xfr
c'était ma ligne de commande de connexionNormalement, nous voulons
ascii-xfr
du côté de la réception, mais comme nous ne l'avons pas, cela-n
fonctionne 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.
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,
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!la source
\r\n
ou tout simplement les\n
deux 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.Vous devriez peut -être essayer minicom .
la source
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.Dans l'exemple ci-dessus, j'ai cloné
sdbYYY
d'une zone source verssdaXXX
la 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.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.la source
J'utiliserais kermit , le grand-parent des programmes de transfert de fichiers. Nous l'avons utilisé bien avant Linux.
la source