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).

61voto

John Tantalo Points 541

Vous pouvez ajouter -o options pour scp au lieu de .ssh/config .

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host est votre "serveur B" dans ce cas.

0 votes

C'est ma façon préférée de procéder. Gâcher le .ssh/config pour le multihopping n'est pas la meilleure solution si vous accédez au même hôte depuis une passerelle ou directement.

0 votes

Comment cela se passerait-il avec des noms d'utilisateur et des ports différents/personnalisés ?

0 votes

J'essaie ceci et je dois entrer le mot de passe. Comment puis-je résoudre ce problème ? Merci.

46voto

tialaramex Points 709

En supposant qu'OpenSSH, ajoutez à votre configuration SSH dans .ssh/config

Host distant
ProxyCommand ssh near nc distant 22

Cela permettra à SSH de se connecter "directement" à la machine nommée distant en passant par la machine nommée near. Il peut alors utiliser des applications comme scp et sftp sur la machine distante.

Pour que cela fonctionne, vous devez installer 'nc', c'est-à-dire netcat, sur la machine nommée near. Mais beaucoup de systèmes modernes l'ont déjà installé.

La solution tar de towo est plus efficace pour les problèmes ponctuels, en supposant que vous ayez mémorisé la syntaxe et les règles de fonctionnement de tar.

0 votes

C'est la même méthode que j'utilise... Dans cet exemple, "distant" serait le serveur C et "proche" serait le serveur B pour plus de clarté...

0 votes

Beaucoup de machines modernes n'ont pas 'nc' : il n'est normalement disponible que pour les machines Linux et seulement sur demande (il ne fait pas partie de l'installation standard).

1 votes

Ssh dispose maintenant de l'option -W, qui fait cela automatiquement sans 'nc', mais je me demande pourquoi il n'y a pas de scp -W.

25voto

Casebash Points 22106

Avec des versions plus récentes de ssh sur le serveur près de la machine (B), ce qui suit fonctionnera sans netcat :

Host distant
    ProxyCommand ssh near -W distant:22

Il faudra cependant que AllowTcpForwarding soit yes (par défaut) sur la machine la plus proche (B).

edit : nécessite OpenSSH 5.4+ sur B

0 votes

Fonctionne comme un charme :)

2 votes

Et depuis OpenSSH 7.4p1 au moins, il existe une commande "ProxyJump" dans laquelle il suffit de lister chaque user@host:port séparé par des virgules. Sympa !

1 votes

ProxyJump est bien, mais il n'a pas pris l'Utilisateur et l'IdentityFile du fichier de configuration. ProxyCommand -W le fait et fonctionne également avec scp.

19voto

Saurabh Barjatiya Points 4643

Vous pouvez vous connecter au serveur B en utilisant quelque chose comme

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Ensuite, vous pouvez vous connecter au serveur C en utilisant

ssh -p 5022 <user_serverC>@localhost 

De même, scp fonctionnerait en utilisant

scp -P 5022 foo.txt <user_serverc>@localhost:

N'oubliez pas d'utiliser la casse correcte de p avec scp et ssh

8voto

donhector Points 171

C'est possible et relativement facile, même lorsque vous devez utiliser des certificats pour l'authentification (typique des environnements AWS).

La commande ci-dessous copiera les fichiers d'un remotePath en server2 directement dans votre machine à localPath . En interne, la demande scp est traitée par le biais d'un proxy. server1 .

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

L'autre façon de procéder fonctionne également (télécharger le fichier) :

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

Si vous utilisez l'authentification par mot de passe à la place, essayez avec

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Si vous utilisez les mêmes informations d'identification de l'utilisateur dans les deux serveurs :

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

El -W est intégrée dans les nouvelles versions d'OpenSSH, donc cela ne fonctionnera que sur les machines ayant la version minimale (5.4, à moins que votre distribution n'ait déporté des fonctionnalités ; par exemple, OpenSSH 5.3p1 de RHEL6 inclut cette fonctionnalité). Selon les notes de version : http://www.openssh.com/txt/release-5.4

Ajout d'un 'mode netcat' à ssh(1) : "ssh -W hôte:port ..." Ceci connecte stdio sur le client à un seul port sur le serveur. Cela permet, par exemple, d'utiliser ssh comme une commande Proxy pour router les connexions via des serveurs intermédiaires.

%h y %p sont des caractères génériques pour l'hôte et le port.

0 votes

Explication ajoutée à pour -W, %h:%p rendront ce post plus utile pour les débutants comme moi. @donhector

0 votes

Si l'utilisateur du serveur 2 dispose d'un sudo sans mot de passe pour récupérer le fichier, comment utiliser sudo pour éviter les erreurs de permission refusée ?

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