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?
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 fichier ~/.ssh/config
sur machine locale, (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.
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 ...]
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)
Vous pouvez maintenant * faire cela comme une ligne, sans exiger nc
n'importe où:
scp -o "ProxyCommand ssh [email protected] -W %h:%p" [email protected]:file .
Explication
pcreds
et tcreds
représentent vos identifiants de proxy et de cible si requis (username
, username:password
, etc.).
Cela est possible grâce à une capacité intégrée de type netcat, qui supprime l'exigence de nc
sur l'hôte intermédiaire. L'utilisation de ssh -W Host:port
configure un tunnel vers l'hôte et le port spécifiés et le connecte à stdin/stdout, puis scp
exécute le tunnel.
Les %h
et %p
dans la ProxyCommand
sont remplacés par l'hôte cible et le port 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 - publié en mars 2010
$ ssh -f -N -L <localport>:<target.machine:port> [email protected]
$ scp [email protected]:/remote/file -P <localport> .
OK, en fait deux commandes ...
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 "C-a d". Pour revenir à cette session d'écran, tapez screen -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
Rappelez-vous que le port local 2222 n’est en réalité qu’un tunnel allant à target.machine.
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 -- X
, voir https://stackoverflow.com/a/23616021/32453
Que diriez-vous:
scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
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 -'"
Une autre solution simple pour transférer un source_file du source_Host vers un destination_Host via un proxy_Host :
Connectez-vous sur le serveur proxy :
ssh login@proxy_Host
Depuis le serveur proxy, transférez le fichier_source du source_Host vers le destination_Host (vous pouvez taper ceci sous la forme d'une ligne, en omettant le \
, ou sous la forme de 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_hôte vers l'hôte proxy_ proxy utilise une clé rsa.
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