101 votes

Comment faire des transferts SCP multi-sauts entre machines ?

Je veux copier un fichier de ma machine A vers le serveur C, mais je n'ai accès au serveur C qu'à travers le serveur B.

Au lieu de transférer d'abord sur le serveur B, de se connecter et de transférer ensuite sur le serveur C, est-il possible de transférer le fichier directement avec SCP ou un programme similaire ?

(Le mode tramp d'Emacs possède cette fonctionnalité pour éditer des fichiers à distance).

6voto

texas-bronius Points 61

Ce n'est pas scp (que l'OP a demandé), mais je l'ai trouvé très simple à utiliser. rsync pour copier de local à distant sur un seul saut avec :

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

Fuente: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

J'avais essayé la suggestion -o ProxyPass ci-dessus et je ne voulais pas changer la configuration pour mes besoins changeants. Comme le dit l'auteur du lien ci-dessus, le fichier de destination précédé de deux points ( :) est important pour indiquer que le chemin spécifié se trouve sur le serveur de destination. En outre, en utilisant rsync, vous avez la possibilité de comparer les dates, de synchroniser les dossiers, etc. J'espère que cela aidera quelqu'un !

0 votes

Vous avez raison. Il est plus facile d'utiliser rsync plutôt que de s'occuper de scp Les bizarreries de l'entreprise.

3voto

towo Points 1887

Si vous voulez être vraiment méchant, vous pourriez enchaîner ssh et tar, quelque chose comme tar c mydir | ssh server "ssh otherserver | tar x" mais cela peut poser de nombreux problèmes.

Le moyen le plus simple serait de configurer un tunnel SSH avec les méthodes intégrées de SSH ; regardez le fichier -D dans la page de manuel et de simplement transférer un port vers le port ssh de l'autre serveur.

2voto

SYANiDE Points 121

Vous pouvez également procéder à l'inverse, ce qui est peut-être plus facile.

Supposons que vous ayez une session ssh ouverte avec la machine à laquelle vous voulez envoyer le fichier. Ce PC le plus éloigné, nous l'appellerons hop2. Votre hôte "proxy" sera hop1. Le PC qui est à l'origine du fichier, nous l'appellerons origine.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Vous pouvez construire des tunnels rendant un port local disponible sur un PC distant. Nous définissons ainsi un port à ouvrir sur le PC distant, qui sera une redirection vers le port que vous avez emporté avec vous lorsque vous avez construit le tunnel.

Sur hop2 :

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Maintenant, dans cette session tunnel ouverte, vous pouvez faire la même chose de hop1 à file_origin.

Sur hop1 :

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

Vous avez maintenant un tunnel de hop2 à hop1 vers l'origine. Par coïncidence, les ports 5555 et 6666 sont maintenant ouverts sur l'origine, ce sont des redirections vers le port 22 de hop2. Dans cette session, les deux éléments suivants sont des routes scp valides vers hop2 :

Sur l'origine :

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

De cette façon, vous pouvez avoir un nombre arbitraire de sauts entre les deux, et il est plus facile de travailler avec en termes de chaînage de plus de deux sauts.

1voto

Essayez d'adapter l'exemple de configuration openssh suivant pour une configuration qui peut être utilisée pour plusieurs hôtes :

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Cela suppose un ensemble de serveurs commençant par "uat-" qui ne sont accessibles que via le serveur jumpbox/gateway "bastion-uat". Vous voulez probablement aussi ajouter ForwardAgent yes si vous utilisez une clé pour vous connecter.

0 votes

N'utilisez pas ForwardAgent yes pour ça. Le transfert d'agent n'est pas nécessaire dans ce cas, car aucun client ssh ne sera exécuté sur le bastion, et le transfert d'un agent lorsqu'il n'est pas nécessaire ne fera que réduire la sécurité. Et je pense que ssh est manquant dans votre commande. Si un récent ssh est utilisée, vous n'avez pas besoin de nc vous pouvez taper ssh -W %h:%p bastion-uat à la place.

0 votes

@kasperd Modifié pour inclure ssh . Re ForwardAgent ; un client ssh sera exécuté afin d'exécuter la commande nc elle-même. Peut-être faites-vous référence au Shell ?

-1voto

IanD Points 21

Scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost:/tmp/.

4 votes

Ne vous contentez pas de jeter un peu de code inexpliqué ici. Il y a beaucoup de bonnes réponses à cette question et vous devez ajouter de la valeur à celles qui existent déjà - ce n'est pas le cas ici.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X