Utilisation de ProxyCommand pour plusieurs sauts et authentification rapide

17

Comment puis-je réécrire la commande suivante avec ProxyCommand?

ssh -l username1 -t jumphost1 \
ssh -l username2 -t jumphost2 \
ssh -l username3 -t jumphost3 \
ssh -l username4    server

Ça ne marche pas

ssh -o ProxyCommand="\
ssh -l username1 -t jumphost1  \
ssh -l username2 -t jumphost2  \
ssh -l username3 -t jumphost3" \
    -l username4    server

username1@jumphost1's password:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
ssh_exchange_identification: Connection closed by remote host

Je suis conscient de son utilisation avec nc, mais je cherche un moyen de l'utiliser avec 3+ sauts, et j'utilise également cette option avec scp. J'ai vérifié la ssh_configpage de manuel, mais les informations sont assez rares, du moins pour moi.

ÉDITER

J'ai essayé d'utiliser ProxyCommandimbriqué dans un autre ProxyCommandcomme suggéré ci-dessous, mais j'obtiens toujours quelque chose dans le sens suivant

debug3: ssh_init_stdio_forwarding: 192.17.2.2:2222
debug1: channel_connect_stdio_fwd 192.17.2.2:2222
debug1: channel 0: new [stdio-forward]
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
debug1: getpeername failed: Bad file descriptor
debug3: send packet: type 90
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting [email protected]
debug3: send packet: type 80
debug1: Entering interactive session.

Heureusement, depuis 7.3 -Jou ProxyJumpsert mon but - même si je dois encore contourner la configuration de mes clés.

ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server
1,61803
la source

Réponses:

25

La ncversion n'est plus recommandée. Utilisez le -Wcommutateur, qui est fourni dans les versions récentes d'OpenSSH. De plus, vous n'avez pas besoin de copier la configuration sur d'autres hôtes! Toute la configuration doit être effectuée sur votre hôte et cela n'interfère scpen aucune façon avec le. Créez simplement un fichier ~/.ssh/configavec:

Host jumphost1
  User username1
Host jumphost2
  User username2
  ProxyCommand ssh -W %h:%p jumphost1
Host jumphost3
  User username3
  ProxyCommand ssh -W %h:%p jumphost2
Host server
  User username4
  ProxyCommand ssh -W %h:%p jumphost3

Et puis connectez-vous en utilisant ssh serverou en utilisant scp file server:path/. Si vous insistez sur un liner (ou si vous ne savez pas ce que vous voulez dire sur l' ProxyCommandimbrication), alors comme déjà souligné, c'est un enfer d'évasions:

ssh -oProxyCommand= \
  'ssh -W %h:%p -oProxyCommand= \
    \'ssh -W %h:%p -oProxyCommand= \
      \\\'ssh -W %h:%p username1@jumphost1\\\' \
    username2@jumphost2\' \
  username3@jumphost3' \
username4@server

Vous devez essentiellement aller de l'intérieur.

Jakuje
la source
Merci. J'ai essayé le one-liner, ça n'a pas marché. Je ne sais pas si c'est seulement l'évasion. Pouvez-vous revérifier, s'il vous plaît? Pouvez-vous également expliquer pourquoi l'imbrication est nécessaire et le chaînage ne fonctionne pas?
1.61803
1
Eh bien, qu'est-ce qui "ne fonctionne pas!" signifier? Le chaînage fonctionne, mais pas avec scp, car SCP attend des messages de contrôle SCP, mais obtient à la place des messages de contrôle SSH et échoue. D'un autre côté, le ProxyCommandfait de manière transparente et donc le plus à l'extérieur ssh(ou scp) recevra les messages directement de l'autre extrémité.
Jakuje
Je reçois l' > invite où attend pour interrompre la suite de la ligne, je suppose - c'est-à-dire que la commande ne s'exécute jamais.
1.61803
1
@TrevorBoydSmith Parce que cela nécessite que vous ayez un programme externe (nc) installé sur tous les hôtes proxy. La redirection IO à l'aide de -W n'a pas besoin de cela et la seule condition est d'avoir un client openssh installé sur votre ordinateur.
Jakuje
2
@RomanDodin double %devrait fonctionner: %%hdans votre cas
Jakuje
-1

Je l'ai fait avec deux sauts, mais cela devrait fonctionner pour trois. Le moyen le plus simple consiste à ~/.ssh/configdéfinir le fichier sur chaque hôte. Donc, si vous voulez être allumé hostaet accéder à hostdvia hostbet hostc`, vous pouvez définir vos configurations de la manière suivante:

Dans hosta:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostb nc %h %p 2> /dev/null

Dans hostb:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostc nc %h %p 2> /dev/null

Dans hostc:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostd nc %h %p 2> /dev/null

Vous pouvez ensuite ssh hostdaccéder à l'un des hôtes de la chaîne et vous vous dirigerez vers hostd.

L'utilisation de netcat pour le proxy n'interfère pas avec scp.

Si pour une raison quelconque vous ne voulez vraiment pas utiliser de ~/.ssh/configfichiers locaux , vous pouvez le faire sur hosta:

ssh -oProxyCommand='ssh -oProxyCommand=\'ssh -o ProxyCommand=\\\'ssh username@hostd nc %h %p 2>/dev/null\\\' username@hostc nc %h %p 2> /dev/null' username@hostb nc %h %p 2> /dev/null' username@hostd
DopeGhoti
la source
Comme je l'ai dit, je connais son ncutilisation. Pouvez-vous réellement réécrire la commande avec laquelle j'ai posté ProxyCommanden option?
1.61803
Vous mentionnez "vous êtes conscient de son utilisation mais souhaitez l'utiliser scp". Cela n'interfère pas avec scp. Mais je vais vous donner la commande comiquement longue sous forme de montage sous peu.
DopeGhoti
Merci. Pourriez-vous simplement réécrire votre réponse en vous concentrant sur l' ProxyCommandimbrication? Si vous relisez mon article, vous verrez que c'est l'essentiel. Je pensais que je pouvais, au lieu d'imbriquer comme vous, enchaîner tous les nœuds du milieu ProxyCommand. Je me demande toujours si c'est possible.
1.61803
C'est en fait ce qui se fait; c'est juste beaucoup plus difficile à lire que les configurations in situ à cause de toutes les citations imbriquées (et de plus en plus échappées). Vous devez le faire de cette façon car vous transportez toutes les ProxyCommanddirectives avec vous vers le prochain hôte de la chaîne.
DopeGhoti
C'est faux. La configuration se fait uniquement sur votre ordinateur local, non répartie entre les hôtes en cours de route comme vous essayez de le proposer.
Jakuje