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