Scp sur un proxy avec une commande de la machine locale?


54

J'ai ma machine locale, la machine proxy et la machine cible. local.machine n'a pas de contact direct avec target.machine, mais doit passer par proxy.machine.

Je veux scp un fichier de target.machine à local.machine. Est-ce possible de le faire avec une seule commande de local.machine?

Réponses:


64

Je sais que c'est une réponse tardive, mais je viens de découvrir une façon géniale de le faire. C'est fondamentalement la réponse de Holger Just, mais dans un fichier de configuration enregistré:

Vous devez mettre cela dans votre ~/.ssh/configfichier sur local.machine, (créer le fichier s'il n'existe pas)

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

Après avoir sauvegardé le fichier, vous pouvez simplement utiliser

ssh target.machine

chaque fois que vous voulez vous connecter. Scp fonctionnera également car il respecte également le fichier de configuration ssh. Tout comme Nautilus, si vous utilisez GNOME et souhaitez utiliser une interface graphique.


5
Juste un petit mot. Si vous utilisez un autre fichier d'identité via l'option de ligne de commande -i pour ssh, vous devez spécifier cette option pour la configuration ProxyCommand et la ligne de commande ssh.
BillMan

7
3 choses qui pourraient aider, 1) cela aiderait si vous montriez également les Host proxy.machinelignes dans le même ~/.ssh/configfichier, 2) Mentionnez si ces commandes peuvent être imbriquées (c'est-à-dire que le client se connecte à l'hôte proxy 1 qui se connecte à l'hôte proxy 2 qui se connecte à. ..target) et 3) ce que nc %h %psignifie
puk

Comment pouvons-nous copier d'un ordinateur local vers un ordinateur cible avec proxy?
Mulagala

19

Vous pouvez le faire en une seule commande, mais vous devez installer netcat (nc) sur la machine proxy:

ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine

[EDIT: mélangé l'ordre des machines ...]


Bien essayé, mais où devrais-je ajouter le nom d'utilisateur pour le proxy et pour la connexion?
grm

Jzst avant les noms de machine, avec un @. J'ai modifié ma réponse pour refléter cela.
Holger le

19

Vous pouvez maintenant * faire cela comme une ligne, sans avoir besoin de nc n'importe où:

scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .

Explication

pcredset tcredsreprésenter vos informations d' identification de proxy et cible si nécessaire ( username, username:password, etc.).

Cela est possible grâce à une capacité intégrée de type netcat, qui supprime l'exigence de ncsur l'hôte intermédiaire. L'utilisation de ssh -W host:portconfigure un tunnel vers l'hôte et le port spécifiés et le connecte à stdin / stdout, puis scps'exécute sur le tunnel.

Le %het %pen ProxyCommandsont remplacés par l'hôte et le port cible que vous spécifiez.

Pour encore plus de commodité, vous pouvez configurer le proxy dans votre configuration ssh:

Host target.machine
    ProxyCommand ssh pcreds@proxy.machine -W %h:%p

et à partir de là juste faire

scp tcreds@target.machine:file .

* depuis OpenSSH 5.4 - sorti en mars 2010


1
Vérifié, cela fonctionne bien, et ne laisse pas de processus NC obsolètes traîner sur la machine proxy.
LaXDragon

1
Où puis-je spécifier le port du proxy?
Marged

1
@ Marged Je ne suis pas en mesure de l'essayer ici pour le moment, mais je pense que vous devriez pouvoir inclure -p <portnum>avant la -Wdans l'une ou l'autre méthode pour spécifier le port proxy
CupawnTae

1
Il m'a fallu un certain temps pour que l'option -i (si vous en avez besoin) va dans les citations. Le proxy ssh n'utilise pas par défaut la même clé privée que celle spécifiée par les options -i fournies directement à scp. Je suppose que c'est évident quand on y pense.
Keeely

18

Si cela ne vous dérange pas d'utiliser rsync au lieu de scp, vous pouvez utiliser l'un des doublons suivants:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(vous aurez besoin d'un accès sans mot de passe à la machine proxy)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

OK, en fait deux commandes ...


1
Comment puis-je spécifier le port de mon proxy? Dans mon cas8080
Marged

@ Marged ajouter -p <portnumber>à votre commande ssh
weeheavy

6

Un one-liner? Pas par hasard. Vous devez d'abord établir un proxy et vous ne pouvez pas le faire avec scp seul.

En le faisant manuellement, j'ouvre une session d'écran pour mon tunnel:

screen -S tunnel

Screen est utilisé pour maintenir le tunnel dans un shell d'arrière-plan. Utilisez n'importe quelle technique pour garder le tunnel ouvert en arrière-plan (la réponse de @ weeheavy est probablement la plus simple). Une fois dans la session d'écran, je commence mon tunnel comme si

ssh -L 2222:target.machine:22 [user@]proxy.machine

Pour décomposer cela, cela dit en gros "Sur ma machine locale, ouvrez le port 2222 et toute connexion touchant localhost: 2222 est mandatée par proxy.machine vers target.machine: 22"

Une fois que vous avez établi la connexion ssh et le tunnel, déconnectez-vous de la session écran avec "Ca d". Pour revenir à cette session d'écran, tapezscreen -raAd tunnel

Une fois que vous êtes de retour dans votre shell d'origine, votre commande scp ressemblera à

scp -P 2222 localhost:your/file/on/target.machine local/path

N'oubliez pas que le port local 2222 n'est en réalité qu'un tunnel allant à target.machine.


3

Apparaît que scp supporte l'option "-o" comme ssh, bien que je ne sois pas sûr de lui transmettre un nom d'utilisateur / mot de passe proxy:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

Si vous obtenez, nc: invalid option -- Xconsultez https://stackoverflow.com/a/23616021/32453


dope bro, a travaillé tout de suite :)
Elouan Keryell-Même

2

Que diriez-vous:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

ou éventuellement nom d'utilisateur: mot de passe ici?
rogerdpack

1

Vous pouvez essayer quelque chose comme:

ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file

Mais cela ne fonctionnera pas si votre proxy.machine doit vous demander votre mot de passe (SSH n'est pas dans un TTY, donc askpass échouera).

Si vous avez plus d'un fichier, vous pouvez utiliser tar comme ceci (non testé, j'utilise habituellement un netcat de cette façon):

tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"

1

Une autre solution simple pour transférer un source_file du source_host à un destination_host via un proxy_host :

Connectez-vous sur le serveur proxy :

ssh login@proxy_host

A partir du serveur proxy, transférer le source_file du source_host au destination_host (vous pouvez taper cela comme une ligne, en omettant le \, ou deux lignes, comme indiqué ci - dessous):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

Cela nécessite que la connexion sur l'hôte source à l'hôte proxy utilise une clé rsa.


0

Si vous devez utiliser des clés publiques, vous aurez besoin de quelque chose comme ceci.

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem

0

J'ai suivi cet article et trouvé une réponse qui fonctionne pour moi. (Parce que les réponses ci-dessus ne fonctionnent pas pour moi).

Comment créer scpun fichier via un hôte intermédiaire (ou hôte de saut) http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

Et ma réponse est comme ci-dessous:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

Exemple:

scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
        archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz

J'espère que cette réponse pourrait vous aider.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.