par Henry Grebler (Copyright © 20110)
traduction par Sofiane REFES(tous droits réservés) sofiane.refes CHEZ gmail POINT com
relecture Gaël Montreuil g43l CHEZ yahoo POINT fr
Dans l'article précédent, Histoire de tunnels 1 J'ai Décrit comment utiliser des tunnels SSH et une troisième machine pour fournir L'accès au réseau d'une machine à une deuxième machine qui n'était pas directement accessible. Le scénario d'aujourd'hui est tout à fait Différent.
Nous voulons l'accès commode à une machine qui peut seulement être atteinte par la navigation d'une chaîne de machines intermédiaires.
Tandis que la tâche précédente pourrait être accomplie avec une seule commande, la tâche actuelle est beaucoup plus formidable et exige une magie plus puissante.
Cet article supposera que vous êtes très familiers de SSH. Je ne répèterai pas les points que j'ai faits dans l'article précédent.
Mots-clés: SSH tunnels, expect
Les réseaux entrent dans toutes les formes et tailles .Je suis sûr que le réseau original a été conçu.Je suppose que, au fil du temps, une machine a été ajoutée ici, un autre a été enlevé là - beaucoup comme un costume bien aimé pourrait être modifié comme les âges de ses propriétaire et change de forme.
Au moment où je suis arrivé, le réseau semblait tout à fait complexe. Cela Était assez facile d'obtenir des machines plus récentes. Mais quelques anciennes machines ont exigé quelques claquettes sérieuses avant qu'elles ne puissent être Atteintes.
target la machine sur la quelle je veux travailler jump1 une machine intermédiaire jump2 une autre machine intermédiaire machine laptop mon ordinateur portable
Si j'avais besoin de se rendre à la machine cible une ou deux fois ,je voudrais juste ssh depuis mon ordinateur vers jump1; puis de nouveau à partir de là vers jump2; et finalement à partir de là vers la machine cible
Mais je savais que je visiterais target plusieurs fois au cours de la semaine ou des deux semaines prochaines. Et plus loin, et plus intéressant, j'aurais besoin de transférer des fichiers entre mon ordinateur portable et l'ordinateur cible.
Encore une fois, pour le transfert de fichiers, la plupart des gens vous suggère dans l'exaspération de simplement les transférer d'une machine à l'autre jusqu'à ce qu'ils atteignent la destination requise.
J'exécute la commande suivante sur mon ordinateur portable :
ssh -L 9922:localhost:9822 jump1
La commande dit d'établir une connexion vers SSH jump1. "Pendant que vous y êtes, je veux que vous écoutiez sur un port numéroté 9922 sur localhost (ie ordinateur portable).Si quelqu'un fait une connexion à ce port, connecter l'appel par le biais du port 9822 sur jump1."
Pourquoi 9922? Le numéro de port est arbitraire, mais j'utilise la forme XX22pour me rappeler que cela se rapporte à SSH.
Pourquoi 9822? Il semble que ce numéro de port est aussi arbitraire que 9922, mais ce n'est pas entièrement vrai. Nous allons examiner un peu plus tard.
Jusqu'à présent, nous n'avons pas obtenu grand-chose.
ssh -L 9822:localhost:9722 jump2
Vous devriez pouvoir mettre au point ce que cette commande fait. Bien sûr cette fois, localhost signifie jump1.
Le numéro de port sur la gauche (dans ce cas 9822) doit être le même que celui sur le droit de la commande précédente.
Avant d'expliquer plus, je vais juste ajouter une commande.
À ce moment là, la dernière étape devrait être évidente. Pour rendre l'analyse ultérieure plus facile à suivre, je vais énumérer toutes les trois commandes, puis on en discutera.
ssh -L 9922:local host:9822 jump1 ssh -L 9822:localhost:9722 jump2 ssh -L 9722:localhost:22 target
Les trois commandes m'aideront à trouver la machine cible, où je peux faire tout le travail que je dois faire. C'est un effet. L'effet de bord est plus intéressant.
Assez souvent, lorsque je visite une machine, je tiens à lancer plusieurs sessions, et pas seulement une seule session. Pour démarrer une deuxième session, J'ai pu j'ai pu utiliser un ensemble similaire de commandes ssh (avec ous sans l'option -L).Ou bien, sur mon portable, je pouvais faire:
ssh -p 9922 localhost
La référence au port 9922 sur localhost me connecte au port 9822 sur jump1, qui m'a automatiquement connecté au port 22 sur jump2.
Les tunnels individuelles se combinent pour me fournir un «super-tunnel".
Il devrait maintenant être clair que la commande ssh qui vous mène à la cible (la dernière machine), doit avoir 22 comme numéro de port sur la droite de localhost dans l'option -L. Tous les commandes ssh précédentes créent des "stepping-stones". La dernière commande sshdoit vous mener vert le port réel sur lequel SSH daemon ecoute (en général 22).
Comme dans l'article précédent, les flèches dans le diagramme sont significatifs: les tunnels sont unidirectionnels pour l'invocation. En d'autres termes, je peux utiliser le tunnel pour arriver à la cible depuis mon ordinateur portable, mais je ne peux pas utiliser ce tunnel pour arriver à mon ordinateur portable à partir de la cible. (Je dois faire quelque chose de différent si c'est ce que je voulais. Je vais laisser ça comme un exercice pour le lecteur.)
Ce n'est pas vraiment très restrictive. Après tout, je fais tout ce travail alors que je suis assis devant mon ordinateur portable, en utilisant son clavier, souris et écran.
Le dernier point peut aider à clarifier la différence entre -L (local) et -R (distant). Le tunnel peut être décrit comme ayant une «bouche» à une extrémité - à l'extrémité où il est entré. (J'ai peut-être choisi une métaphore malheureuse. Il ne faut pas se préoccuper de l'autre bout!) Sur les schémas, les flèches représentent l'autre extrémité de chaque tunnel.
Ainsi l'article précédent utilisé -R parce que la bouche du tunnel était sur une machine distante (distant par rapport à la machine sur laquelle la commande ssh a été lancé);alors que cet article utilise -L parce que, dans chaque cas, l'entrée du tunnel est sur la machine locale (la machine sur laquelle la commande ssh a été lancé).
On peut dire encore plus de valeur que d'être en mesure de faire ssh à la machine distante en une seule commande est la capacité de scp (ou rsync) vers et depuis la machine distante en une seule commande.
Utilisez les commandes de la manière suivante::
scp -p -o 'port 9922' /path/to/single.file localhost:/tmp scp -p -o 'port 9922' localhost:/path/to/single.file /tmp RSYNC_RSH="ssh -o 'NoHostAuthenticationForLocalhost yes' \ -o 'UserKnownHostsFile /dev/null' -p 9922" export RSYNC_RSH rsync -urlptog /path/to/top_dir localhost:/tmp
Gardez à l'esprit que les copies se produisent entre l'ordinateur portable et l'ordinateur cible en une seule commande non pas en une seule étapeNous n'avons pas trouvé un moyen magique pour contourner les machines intermédiaires. Sous les couvertures, les données de chaque machine va à la machine adjacente dans le tunnel. Nous avons seulement sauvé la frappe. Mais c'est encore extrêmement précieux.
Quelqu'un at-il demandé pourquoi je continue à utiliser des numéros de ports différents?
Pourquoi n'ai-je pas fait:
ssh -L 9922:localhost:9922 jump1Si vous alliez poser cette question, bien vu.
La façon dont j'ai dessiné les schémas, et la façon dont le problème présenté à l'origine, il aurait été tout à fait raisonnable que toutes les 9X22 soient les mêmes. (le 22 devrait encore être 22.)
Parce que, bien sûr, chaque commande ssh est exécuté sur une machine différente, et les ports doivent être uniques seulement sur un seule machine (strictly, interface of a machine).Et ce dernier petit complément entre parenthèses m'a juste enseigné quelque chose. Plus tard.]
Il s'avère que lorsque je tentais derésoudre le problème, je n'étais plus au travail.J'étais à la maison où je n'ai pas la chance d'avoir 3 machines de rechange disponibles pour simuler les conditions du scénario.
Imperturbable, J'ai commencé à travailler sur le problème en se connectant à plusieurs reprises à ma propre machine. Mais cela fait retomber la prémisse d'un paragraphe plus haut: je n’exécute plus de cahque commande ssh sur une machine différente. Et j'ai donc dû utiliser des numéros de ports différents.
Il n'y a pas de mal à utiliser des numéros de ports différents; sans doute, il rend la solution plus générale. D'autre part il ya un risque d'épuisement des numéros de port si la chaîne devien ridiculement longue.
Il est important que le numéro de port à la gauche de chaque localhost (sauf le premier) est le même que le numéro de port à la droite du précédent localhost. C'est donc un argument pour garder les choses simples et utiliser un seul numéro de port tout au long de l'expérience (sauf pour le dernier 22 ).
C'est tout ce dont vous avez besoin pour améliorer sensiblement votre vie lorsque vous rencontrez un scénario similaire.
Qu'est-ce que c'est? Vous pensez qu'il ya encore trop de frappe? Vous en voulez plus?
Oh, très bien.
Voici un script attendu et assez long :
#!/usr/local/bin/expect -f # ssh_tunnel.exp - ssh vers la machine distante via des machines intermédiaires set timeout -1 set HOSTS [list jump1 jump2 target] set PORTS [list 9922 9822 9722 9622 9522 9422 9322 9122 9022] # Le port de la dernière machine doit être de 22 set jj [llength $HOSTS] lset PORTS $jj 22 set i 0 foreach HOST $HOSTS { puts "HOST= $HOST PORT= [lindex $PORTS $i]" set i [expr {$i + 1}] } send_user "\n" #----------------------------------------------------------------------# # Procédure pour obtenir une machine #----------------------------------------------------------------------# proc gotomachine {lport rport host} { send_user "Getting on to machine $host ... " send -- "ssh -L $lport:localhost:$rport $host\r" log_user 0 expect -exact "Starting .bash_profile" expect -exact "Finished .bash_profile" expect -exact "-bash" send -- "env | grep SSH_CONNECTION\r" log_user 1 send_user "done.\n" } #----------------------------------------------------------------------# match_max 100000 set dollar "$" spawn bash log_user 0 expect -exact "-bash" send -- "unset HISTFILE\r" expect -exact "-bash" send -- "unset ignoreeof\r" expect -exact "-bash" send -- "PS1='\n vous avez besoin d'un autre exit pour revenir" send -- "vers où vous avez commencé\n utilise ^D. $ '\n" expect -exact "started" log_user 1 set i 0 foreach HOST $HOSTS { set lport [lindex $PORTS $i] set i [expr {$i + 1}] gotomachine $lport [lindex $PORTS $i] $HOST } puts " Houston, ceci est la Base de Tranquillité. L'aigle a atterri. Vous devriez maintenant pouvoir obtenir à cette machine ($HOST) en utilisant directement : ssh -p [lindex $PORTS 0] localhost Pour déconnecter le tunnel, utilisez la commande suivante à plusieurs reprises: " puts { [ "$SSH_CONNECTION" = '' ] || exit } puts " Bonne chance! " interagir exit
Quand j'ai développé la solution sur ma machine, j'avais la fausse impression que je n'avais pas d'autre choix que d'utiliser des numéros de ports différents. Comme écrit dans cet article, j'ai dit que les ports ne doivent être uniques sur une seule machine - et puis je me suis corrigé et dit qu'ils doivent être uniques sur une seule interface.
Cela ouvre la possibilité d'une simplification de l'écriture ssh_tunnel.exp - au détriment de la mise en place des interfaces virtuelles sur ma machine unique. Si je faisais cela à partir de zéro maintenant, c'est ce que je ferais.
Il devient constamment très confus de se connecter sur une machine unique. Cela représente le grand nombre de lignes traitant avec la déconnexion du tunnel. J'avais peur, je quitter trop souvent et je m'éloignais de mon xterm .
expect. As usual, I've set up certificates on all relevant machines, so no paswords are necessary.
Vous devriez maintenant avoir les outils pour naviguer commodément à travers toute la chaîne de machines.
Lire l'article précédent, cet article devrait vous avoir donné suffisamment d'informations pour gérer le scénario précédent sans «tricher».
Vous devriez être capable d'extrapoler à partir de ces articles à presque toutes les configurations de machines.
Henry Grebler
Henry a passé ses journées à travailler avec des ordinateurs, la plupart du temps pour des fabricants d'ordinateurs ou les développeurs de logiciels. Son expérience en informatique précoce comprend les reliques telles que des cartes perforées, bandes de papier et rubans magnétique. C'est son sombre secret qu'il aie été payé pour faire le genre de choses qu'il aurait versé de l'argent pour être autorisés à le faire. Il suffit de ne pas dire à l'un de ses employeurs.
Il utilise Linux comme son bureau d'accueil personnelle puisque la famille a obtenu son premier PC en 1996.quand la famille a partagé l'unique PC , c'était un dual-boot Windows / Slackware configuration. Maintenant que chaque membre a son propre ordinateur, Henry survit en quelque sorte dans un monde purement Linux.
Il vit dans une banlieue de Melbourne, en Australie.
Adaptation française de la Gazette Linux
L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux
Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.
Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site http://www.traduc.org/Gazette_Linux
Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.