Comment puis-je SCP un fichier via un serveur intermédiaire?

15

J'utilise Ccygwin sur WinXP (avec le shell bash). Je veux SCP un fichier de mon hôte local vers une machine distante - host2. Cependant, je ne peux que SSH vers une machine intermédiaire - host1, puis à partir de là SSH vers host2. (Remarque, je ne peux pas accéder à host2 depuis mon hôte local).

Je pensais que la tunnellisation était ma réponse, mais quand j'essaie de créer un tunnel

ssh -L 9999:localhost:9998 dalvarado@host1 'ssh -L 9998:localhost:1234 -N dalvarado@host2'

Mais après avoir tapé cette commande et appuyé sur Entrée, le système se bloque simplement. Quelle est la bonne façon de configurer un tunnel puis de SCP un fichier après?

Merci, -

Dave
la source
2
Duplicate of superuser.com/questions/174160/… - voir ma réponse ci-dessous pour un résumé.
jmetz
De l'utilisateur Meir D : Voir également serverfault.com/questions/337274/…
fixer1234
Copie

Réponses:

17

Cela a déjà été mieux répondu ici .

Pour résumer: mettez ce qui suit dans ~/.ssh/config

Host target.machine
User          targetuser
HostName      target.machine
ProxyCommand  ssh [email protected] nc %h %p 2> /dev/null

et ensuite simplement scpà target.machine à tout moment que vous souhaitez proxy via proxy.machine!

Fonctionne également pour ssh, vous économiserez ainsi du temps sur la machine cible.

Nous remercions user24925 qui a répondu à cette question en 2011.

jmetz
la source
13

Pour configurer un tunnel SSH, utilisez le format suivant:

ssh -L 9999:host2:22 user@host1

Cette commande se connecte au port host1as useret tunnels 9999 sur l'ordinateur émettant la commande au port 22 host2. -Nest facultatif, ou vous pouvez utiliser quelque chose comme topou watchpour maintenir la session active si nécessaire.

Ensuite, il suffit scpd'héberger2 sur localhost: 9999.

Pluie
la source
1
Lorsque j'exécute cette commande, suis-je censé finir par me connecter à host1? De plus, après avoir exécuté cette commande, j'ai ouvert un autre shell bash et exécuté "scp hello.txt localhost: 9999", mais j'ai obtenu une erreur "ssh: connect to host localhost port 22: Connection refusé". Qu'est-ce que je fais mal ici?
Dave
3
Lorsque vous exécutez cette commande, vous serez connecté à host1, oui. La scpsyntaxe de votre commande est cependant incorrecte. Essayez ceci scp -P 9999 hello.txt user@localhost:/path/to/destination/fileoù se usertrouve l'utilisateur sur host2lequel vous souhaitez vous connecter.
Pluie
1
@Rain, vous pouvez mettre cet exemple dans la réponse principale;)
dmeu
5

Depuis OpenSSH 7.3 , vous pouvez utiliser -Jou -o ProxyJumppour spécifier l'hôte bastion / jump. Par conséquent, vers SSH node2via node1:

ssh -J you@node1 you@node2

SCP n'a pas d' -Jargument, mais il le permet -o, donc cela fonctionne:

scp -o ProxyJump=you@node1 file.txt you@node2:~
ZiggyTheHamster
la source
3

Vous pouvez d'abord scper le fichier vers host1, comme ceci:

scp file dalvarado@host1:.

Ensuite, faites-le pour l'héberger sur host2:

ssh -t dalvarado@host1 'scp file dalvarado@host2:.'

L' -toption qui l' sshoblige à allouer un pseudo-terminal, ce qui peut faciliter la tâche de l' scphôte1 pour vous demander une phrase secrète / un mot de passe. Si ssh-agent est en cours d'exécution et configuré partout, vous ne devriez pas être invité à saisir un mot de passe / mot de passe.

Je propose cette alternative, car si vous utilisez un tunnel, vous aurez toujours besoin de deux commandes: une pour configurer le tunnel et une pour copier le fichier à travers. Cela semble plus simple.

Fran
la source
Fantastique solution !!!
Riccardo