Comment puis-je télécharger un fichier à partir d'un hôte sur lequel je ne peux que SSH via un autre hôte?

30

Je souhaite télécharger des fichiers de mon ordinateur de bureau vers mon ordinateur portable.

Je peux connecter mon ordinateur de bureau par SSH au serveur d'organisation, puis SSH du serveur à mon ordinateur de bureau.

Les seules commandes acceptées par le serveur d'organisation sont ssh, ssh1 et ssh2.

Comment puis-je télécharger un fichier depuis mon ordinateur de bureau (distant) via le serveur vers mon ordinateur portable (local)?

yochay magan
la source
2
Utiliser des tunnels SSH inversés? Voir ma réponse ici et l'adapter au besoin: superuser.com/questions/1186905/…
Darren
1
SSH multi-sauts?
mckenzm

Réponses:

37

Les réponses précédentes mentionnent comment utiliser la directive ProxyJump (ajoutée dans OpenSSH 7.3) pour se connecter via un serveur intermédiaire (généralement appelé hôte bastion), mais le mentionnent uniquement comme argument de ligne de commande.

À moins que ce soit une machine sur laquelle vous ne vous connecterez pas à l'avenir, la meilleure chose à faire est de la configurer ~/.ssh/config.

Je mettrais un fichier comme:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

Si vous utilisez une version antérieure d'OpenSSH qui ne prend pas en charge ProxyJump, vous devez la remplacer par l'équivalent:

ProxyCommand ssh -W %h:%p bastion-machine

et si votre version locale de ssh était très ancienne et ne supportait pas -W:

ssh bastion-machine nc %h %p

bien que ce dernier nécessite l' ncinstallation de la machine bastion .

La beauté de ssh est que vous pouvez configurer chaque destination sur le fichier, et elles s'empileront très bien. Ainsi, vous finissez par travailler avec office-machinele nom d'hôte sur tous les outils (ssh, scp, sftp ...) car ils étaient des connexions directes, et ils découvriront comment se connecter en se basant sur ssh_config. Vous pouvez également avoir des caractères génériques Host *.internal.company.localpour que tous les hôtes se terminant comme ça passent par un bastion spécifique, et cela s'appliquera à tous. Une fois configuré correctement, la seule différence entre faire une connexion à un saut ou vingt serait le temps de connexion plus lent.

Ange
la source
36

Si vous avez un OpenSSH récent (8.0), vous pouvez utiliser le -Jcommutateur (jump) :

scp -J user@intermediate user@target:/path

Avec les versions plus anciennes (mais au moins 7.3), vous pouvez utiliser la ProxyJumpdirective , soit en ligne de commande:

scp -o ProxyJump=user@intermediate user@target:/path

ou en ssh_configfichier, comme le montre la réponse de @ Ángel.


Il existe d'autres options comme ProxyCommandou redirection de port, que vous pouvez utiliser sur des versions encore plus anciennes d'OpenSSH. Ceux-ci sont traités dans OpenSSH prend-il en charge la connexion multi-boutiques?

Martin Prikryl
la source
2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy
4
Pour scp, il a été ajouté le 7.10
Ángel
4
Même s'il scpne prend pas en charge -J, il pourrait être encore assez nouveau pour prendre en charge l' ProxyJumpoption; essayez l'une des autres réponses qui utilisent explicitement cette option.
Gordon Davisson
2
Ce devrait être la réponse acceptée. Je méprise toutes les réponses aux sshquestions qui suggèrent de modifier votre configpour des hôtes spécifiques lorsqu'une simple option de ligne de commande est suffisante pour faire le travail.
clemisch
2
"Mépriser" semble être une réaction extrême. Bien sûr, il existe des cas où une modification rapide de la ligne de commande est plus facile que de devoir d'abord modifier le fichier de configuration. Mais si vous prévoyez de vous connecter plusieurs fois au même hôte, je préfère sûrement mettre à jour mon fichier de configuration une fois que de l'utiliser à -J user@intermediatechaque fois que je dois me connecter.
chepner
10

Parfois, nous pouvons simplement utiliser le pipeline. Cette heure est aujourd'hui.

ssh -A user@host1 ssh user@host2 cat filename > filename

Vous pouvez également télécharger

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

Oui, il existe d'autres solutions impliquant le proxy, etc., mais savoir comment le faire est utile.

Josué
la source
Utilisation utile de cat!
Piskvor
Notez que cela donne à tout utilisateur suffisamment privilégié de l'hôte intermédiaire l'accès à votre agent ssh et à vos clés. Les données circulant entre votre hôte et host2 existeront également non cryptées sur host1. Les méthodes utilisant des proxys et sautant dessus évitent ces deux problèmes.
james
@james: je n'ignore pas. Les hôtes du bastion comme ceux-ci sont généralement très fiables.
Joshua
7

Utilisez la ProxyJumpconfiguration:

ProxyJump
Spécifie un ou plusieurs proxys de saut en tant qu'hôte [utilisateur @] [: port] ou URI ssh. Plusieurs proxys peuvent être séparés par des virgules et seront visités séquentiellement. La définition de cette option entraînera la connexion de ssh (1) à l'hôte cible en établissant d'abord une connexion ssh (1) avec l'hôte ProxyJump spécifié, puis en établissant un transfert TCP vers la cible ultime à partir de là.

scp -o ProxyJump=user@intermediate user@target:/path
RalfFriedl
la source
2

Il existe un ancien protocole appelé ZMODEM : peu de programmes le supportent de nos jours, mais quand il fonctionne, il peut être assez pratique.

Vérifiez d'abord si le programme de terminal de votre ordinateur portable prend en charge ZMODEM. (Par exemple, vous pouvez configurer iTerm2 (sur Mac) pour prendre en charge ZMODEM. Un exemple de script est disponible ici .)

Dans votre machine de bureau, exécutez: sudo apt install lrzsz

Maintenant, tout ce que vous avez à faire est de lancer ssh sur votre machine de bureau et de lancer sz (filename). Le fichier sera téléchargé via votre terminal.

jick
la source
1

Configuration sous ssh de l'utilisateur: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

Vous pouvez maintenant copier à partir du serveur intranet directement sur 3 serveurs de saut.

scp [email protected]:/home/user/ ./*

Je préfère cela car il n'est plus nécessaire de spécifier des serveurs de saut avec scp

Lukáš Viktora
la source
0

Via SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt
wuseman
la source
2
L' -3option est décrite comme «Les copies entre deux hôtes distants sont transférées via l'hôte local». alors que je crois que cette question stipule que l'hôte local ne peut pas accéder à "remote2".
Jeff Schaller
2
@JeffSchaller: vous vous connectez à la machine au milieu, puis utilisez -3. Mais cela suppose que vous pouvez vous connecter de la machine du milieu à la première.
Joe
Je ne vois aucun avantage à cela sur -J/ JumpHost. Bien au contraire car il a la limitation que @Joe mentionne.
Martin Prikryl