scp entre deux serveurs n'appartenant pas au même réseau

13

Il y a deux serveurs auxquels je peux accéder avec 2 connexions VPN différentes. J'ai réussi à faire fonctionner les deux VPN en même temps sur ma machine (un peu de règles de routage).

Je veux faire un à scp <remote1>:some/file <remote2>:destination/folderpartir de mon terminal portable. Mais quand j'essaye ceci, la scpcommande qui est invoquée sur remote1 ne peut pas trouver remote2 car ils ne sont pas sur le même réseau. Est-il possible de forcer la scpcommande à passer par mon ordinateur portable en tant que routeur?

Si j'essaie avec Nautilus (se connecter au serveur, aux deux serveurs, puis copier-coller), cela fonctionne, mais j'aimerais le faire à partir d'un terminal.

Danduk82
la source
C'est votre machine qui contacte les deux, remote1 et remote2 . Êtes-vous sûr que l'erreur est que remote1 ne peut pas accéder à remote2 ?
Jan
Oui, l'erreur est ssh: impossible de résoudre le nom d'hôte <remote2>: nom ou service
inconnu
Et si j'essaie d'utiliser l'adresse IP directement pour <remote2>, la connexion échoue après un certain temps (hangout).
Danduk82
Ensuite, je suppose que c'est votre machine qui ne peut pas se connecter à remote2 . Peut-être que les temps de connexion VPN sur ou est flakey ...
Jan
Non, cela fonctionne, même le DNS fonctionne. J'ai vraiment l'impression que la commande scp essaie d'exécuter la connexion entre remote1 et remote2 directement sur remote1 .
Danduk82

Réponses:

34

Les nouvelles versions de scp ont l'option -3

-3

Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts
Andy
la source
génial! Exactement ce dont j'avais besoin. Merci beaucoup
Danduk82
1
Super trouvaille, je ne savais pas ça!
Jan
9

Si vous avez besoin de plus de flexibilité scp -3, la plaine sshet les tuyaux sont amusants.

Cela revient à rediriger le flux sur la machine locale:

ssh sourceRemote 'cat /path/to/sourceFile' \
| ssh destinationRemote 'cat > /path/to/destinationFile'

Vous pouvez ensuite ajouter d'autres redirections de flux à tout moment, par exemple pour chaîner plusieurs machines intermédiaires, ou enregistrer une copie locale du fichier transféré lors de son routage.

Anko
la source
2
Vous obtiendrez une belle barre de progression si la machine source a été pvinstallée et vous remplacez la première catpar elle.
liori
6

En développant la réponse de @ Anko, vous pouvez utiliser tarpour plusieurs fichiers:

ssh -q user@sourcehost 'cd /source/path; tar -czf - files...' | \
ssh -q user@desthost 'cd /dest/path; tar -xzf -'

La compression est entièrement facultative - vos données peuvent ne pas être très compressibles ou suffisamment volumineuses pour justifier la surcharge. Si votre version de tarne prend pas en charge le -zcommutateur, canalisez gzip -cet gzip -dcrespectivement.

PS: Méfiez-vous des versions tarqui ne suppriment pas les barres obliques principales lors de l'extraction (c'est-à-dire, écrivez dans les noms de chemin absolus si fournis).

Edit: -e nonen'est pas nécessaire avec les pipes, car un pseudo-terminal n'est pas alloué.

arielCo
la source
1
ssha un -Cindicateur pour activer la compression de flux. Selon la page man, il utilise le même algorithme que gzipsi. La page de manuel explique également utilement quand l'utiliser: "La compression est souhaitable sur les lignes de modem et autres connexions lentes, mais ne ralentira que les choses sur les réseaux rapides."
Anko
4
@Anko, le problème avec l'utilisation -Cici est que la machine locale devrait décompresser et recompresser les données. Dire tarde faire la compression signifie que les données compressées sont transmises directement dans le tuyau sans aucun traitement.
cjm