ssh via plusieurs hôtes

37

Pour accéder à ma machine dans mon bureau, je suis en train de faire ceci:

me@home:~$ ssh unix.university.com
me@unix:~$ ssh unix.department.univeristy.com
[email protected]:~$ ssh office-machine.department.university.com
me@office-machine:~$ echo "This is very annoying"

Existe-t-il un moyen simple d'automatiser ce processus, peut-être une seule commande que je peux utiliser à ma fin?

Lucas
la source

Réponses:

31

Vous pouvez utiliser le client ssh pour exécuter ssh sur la machine distante lors de la connexion.

ssh -t unix.university.com \
    ssh -t unix.department.univeristy.com \
    ssh -t office-machine.department.university.com

(La raison pour laquelle j'ai inclus -tles invocations est parce que ssh m'avait donné des erreurs re: stdin n'étant pas un terminal lorsque je l'ai essayé sur ma propre machine, votre machine peut être différente.)

Lorsque vous quittez le dernier shell, le processus s'enchaîne, ce qui vous évite de taper Ctrl-Dencore et encore.

amphétamachine
la source
Remarque: ajoutez uniquement "-t" si vous vous connectez simplement sur la machine distante. Pour lancer une commande sur la machine distante, NE les mettez PAS car ils peuvent / vont corrompre certaines choses (par exemple::: tar cf - something | ssh somewhere "cd /path/remote ; tar xf - " pourrait devenir corrompu si vous ajoutez -t! Voir par exemple la merveilleuse réponse de StephaneChazelas unix.stackexchange.com/questions/151916/ … )
Olivier Dulac
3
L'utilisation de -J est plus sûre que cette réponse, car vous avez alors la possibilité de stocker toutes les clés ssh sur votre ordinateur local. L'option -J a été introduite dans la version 7.3 d'opshsh, comme indiqué dans la réponse de @Miikka
Erik Sjölund le
1
@ ErikSjölund Openssh n'autorise pas plus d'une -Joption. Je pense que vous pourriez le faire avec plusieurs ProxyCommandoptions dans votre configuration.
amphetamachine
1
@amphetamachine Avec, -Jvous pouvez spécifier une liste de sauts séparés par des virgules. Mais utiliser ProxyCommandavec -Wreste une approche bien meilleure que cette réponse si vous utilisez une version trop ancienne pour être prise en charge -J.
Kasperd
35

Oui, il existe un excellent moyen de le faire en utilisant ssh ProxyCommand et netcat

Mettez quelque chose comme ça dans votre .ssh / config

Host *.department.university.com
User me
ForwardAgent yes
ProxyCommand ssh unix.university.com nc %h %p

Cela se connectera directement à n’importe quel serveur .department.university.com en utilisant l’hôte de saut / bastion unix.university.com. Vous pouvez également avoir besoin d’une strophe pour unix.university.com directement.

Voici un lien expliquant comment cela fonctionne: http://backdrift.org/transparent-proxy-with-ssh

Avec cette technique, vous pouvez maintenant écrire

ssh unix.department.university.com

et tout semblera direct. Des outils tels que rsync, scp, etc. (tout ce qui se trouve dans la pile ssh) fonctionneront également de manière transparente.

Aaron Brown
la source
2
+1 J'utilise quelque chose de similaire à cela pour transmettre des données d'un réseau de test à un réseau de prod via un serveur de transfert.
Arcege
2
Yup, ça marche très bien!
Gabe.
15
Juste pour le compte rendu, les nouvelles versions de ssh supportent l' -Woption, vous pouvez faire quelque chose comme ProxyCommand ssh -W %h:%p gatewayau lieu de dépendre de nc
Ulrich Dangel le
Bon à savoir! Thx
Aaron Brown
2
fonctionne très bien si le nom de l'utilisateur est le même sur toutes les machines; si c'est différent il faut faire quelque chose commeProxyCommand ssh -W %h:%p user@gateway
Riccardo Cossu
9

Dans OpenSSH 7.3, ssh a ajouté le -Jdrapeau de ligne de commande et l' ProxyJumpoption de configuration correspondante pour résoudre exactement ce problème.

Indiquez aux hôtes que vous souhaitez parcourir en tant que liste séparée par des virgules -J. Par exemple:

ssh -J unix.university.com,unix.department.university.com  \
  office-machine.department.university.com
Miikka
la source
-5

Tunneling SSH. Je ne me souviens pas exactement comment faire cela, mais je sais qu'il existe un moyen de faire en sorte qu'une machine permette un tunnel en se connectant peut-être à un port séparé. De cette façon, vous ne ferez que shell sur la même machine initiale (avec un port différent, par exemple) et vous serez redirigé vers votre emplacement final.

Devrait chercher comment le configurer si.

:)

Anthony Hurst
la source
Vous ne voulez pas (et probablement vous ne pouvez pas) ouvrir un port ou la passerelle SSH de votre université…
Stéphane Gimenez
9
Si vous ne savez pas comment faire et que vous ne voulez pas chercher, pourquoi avez-vous posté cette réponse?
Amphetamachine
4
Pas vraiment une réponse
gabe.