web-dev-qa-db-fra.com

Comment scp avec un deuxième hôte distant

Je me demande s’il est possible de mapper le fichier SCP à partir de l’hôte distant2 directement à partir de mon ordinateur local en passant par un hôte distant1.

Les réseaux autorisent uniquement les connexions à l'hôte distant2 à partir de l'hôte distant1. En outre, ni l'hôte distant1 ni l'hôte distant2 ne peuvent envoyer un scp à ma machine locale.

Y a-t-il quelque chose comme:

scp user1@remote1:user2@remote2:file .

Première fenêtre: ssh remote1, puis scp remot2:file ..

Deuxième shell: scp remote1:file .

Première fenêtre: rm file; logout

Je pourrais écrire un script pour faire toutes ces étapes, mais s’il existe un moyen direct, je préférerais l’utiliser.

Merci.

EDIT: Je pense quelque chose comme ouvrir des tunnels SSH mais je ne sais pas trop quelle valeur mettre où.

Pour le moment, pour accéder à remote1, j'ai le texte suivant dans $HOME/.ssh/config sur ma machine locale.

Host remote1
   User     user1
   Hostname localhost
   Port     45678

Une fois sur remote1, accéder remote2, il s’agit du DNS local standard et du port 22. Que dois-je mettre sur remote1 et/ou changement sur localhost?

71
Danosaure

Je ne connais aucun moyen de copier le fichier directement dans une seule commande, mais si vous pouvez vous permettre d'exécuter une instance SSH en arrière-plan pour conserver un tunnel de transfert de port ouvert, vous pouvez copier le fichier en une seule commande.

Comme ça:

# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .

Notez que vous vous connectez en tant que user2@localhost dans la commande scp réelle, car c’est sur le port 1234 de l’hôte local que la première instance ssh écoute les connexions de transfert vers remote2. Notez également que vous n'avez pas besoin d'exécuter la première commande pour chaque copie de fichier suivante; vous pouvez simplement le laisser fonctionner.

88
Dolda2000

Double ssh

Même dans votre cas complexe, vous pouvez gérer le transfert de fichiers en utilisant une seule ligne de commande, simplement avec ssh ;-)
Et ceci est utile si remote1 ne peut pas se connecter à localhost:

ssh user1@remote1 'ssh user2@remote2 "cat file"' > file

tar

Mais vous perdez les propriétés du fichier (propriété, autorisations ...).

Cependant, tar est votre ami pour conserver ces propriétés de fichier:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x

Vous pouvez également compresser pour réduire la bande passante du réseau:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj

Et tar vous permet également de transférer un répertoire récursif par l'intermédiaire de ssh de base:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj

ionice

Si le fichier est volumineux et que vous ne voulez pas perturber d'autres applications réseau importantes, vous risquez de manquer la limitation du débit réseau fournie par scp et rsync outils (par exemple, scp -l 1024 user@remote:file n'utilise pas plus de 1 Mbits/seconde).

Mais une solution de contournement utilise ionice pour conserver une seule ligne de commande:

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

Remarque: ionice peut ne pas être disponible sur les anciennes distributions.

65
olibre

Ça fera l'affaire:

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' user@remote2:path/to/file .

Pour SCP le fichier de l'hôte remote2 directement, ajoutez les deux options (Host et ProxyCommand) à votre fichier ~/.ssh/config (voir aussi this réponse sur superutilisateur). Ensuite, vous pouvez exécuter:

scp user@remote2:path/to/file .

de votre machine locale sans avoir à penser à remote1.

29
John Manak

Avec la version openssh 7. et plus, c'est facile. Utilisez l'option ProxyJump dans le fichier de configuration.

# Add to ~/.ssh/config 
Host bastion
    Hostname bastion.client.com
    User userForBastion
    IdentityFile ~/.ssh/bastion.pem

Host appMachine
    Hostname appMachine.internal.com
    User bastion
    ProxyJump bastion                   # openssh 7.3 version new feature ProxyJump
    IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion Host  

Commandes à exécuter pour se connecter ou copier

ssh appMachine   # no need to specify any tunnel. 
scp helloWorld.txt appMachine:.   # copy without intermediate jumphost/bastion Host copy.** 

bien sûr, vous pouvez spécifier le bastion Jump Host en utilisant l’option "-J" de la commande ssh, si elle n’est pas configurée dans le fichier de configuration.

Remarque scp fait pas semble prendre en charge le drapeau "-J" à partir de maintenant. (Je ne pouvais pas trouver dans les pages de manuel. Cependant, ci-dessus, scp fonctionne avec le paramétrage du fichier de configuration)

5
user3851404

Cette configuration fonctionne bien pour moi:

Host jump
   User username
   Hostname jumphost.yourorg.intranet
Host production
   User username
   Hostname production.yourorg.intranet
   ProxyCommand ssh -q -W %h:%p jump

Puis la commande

scp myfile production:~

Copies myfile vers production machine.

0
anydoby