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?

grm
la source

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 [email protected] 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.

utilisateur24925
la source
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 [email protected] nc -w 1 %h 22" [email protected]

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

Holger Just
la source
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 [email protected] -W %h:%p" [email protected]: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 [email protected] -W %h:%p

et à partir de là juste faire

scp [email protected]:file .

* depuis OpenSSH 5.4 - sorti en mars 2010

CupawnTae
la source
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)

dubek
la source
8
$ ssh -f -N -L <localport>:<target.machine:port> [email protected]
$ scp [email protected]:/remote/file -P <localport> .

OK, en fait deux commandes ...

très lourd
la source
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.

Whaley
la source
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

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

Que diriez-vous:

scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
eggroll77
la source
ou éventuellement nom d'utilisateur: mot de passe ici?
rogerdpack
1

Vous pouvez essayer quelque chose comme:

ssh [email protected] "ssh [email protected] '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 [email protected] "ssh [email protected] 'tar xvf -'"
Eric Darchis
la source
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.

lomai
la source
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
Leo
la source
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 [email protected]" \
        archive.gz [email protected]:/home/wise/archive.gz

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

Wise Lin
la source