Souvent, je suis confronté à cette situation: je sshed sur un serveur distant et exécuté des programmes, et je veux copier leurs fichiers de sortie sur mon ordinateur local. Ce que je fais est de rappeler le chemin du fichier sur la machine distante, quitter la connexion, puis scp user@remote:filepath .
Évidemment ce n'est pas optimal. Ce que je recherche, c’est un moyen de me laisser le fichier scp de nouveau sur la machine locale sans sortir de la connexion. J'ai fait quelques recherches, presque tous les résultats me disent comment faire des SCP à partir de ma machine locale, que je connais déjà.
Est-ce possible? Mieux encore, est-ce possible sans avoir besoin de connaître l'adresse IP de ma machine locale?
Étant donné que vous avez une sshd
exécutée sur votre ordinateur local, c'est possible et vous n'avez pas besoin de connaître votre adresse IP sortante. Si le transfert de port SSH est activé, vous pouvez ouvrir un tunnel sécurisé même si une connexion SSH est déjà ouverte et sans y mettre fin.
Supposons que vous ayez une connexion ssh sur un serveur:
local $ ssh [email protected]
Password:
remote $ echo abc > abc.txt # now we have a file here
OK, nous devons maintenant copier ce fichier sur notre serveur local et, pour une raison quelconque, nous ne souhaitons pas ouvrir une nouvelle connexion. OK, obtenons la ligne de commande ssh en appuyant sur Enter ~C
(Entrée, puis tilde, puis C majuscule):
ssh> help
Commands:
-L[bind_address:]port:Host:hostport Request local forward
-R[bind_address:]port:Host:hostport Request remote forward
-D[bind_address:]port Request dynamic forward
-KR[bind_address:]port Cancel remote forward
Cela ressemble aux options -L/R/D
habituelles. Nous aurons besoin de -R
, alors nous tapons à nouveau sur Enter ~C
et tapons:
ssh> -R 127.0.0.1:2222:127.0.0.1:22
Forwarding port.
Ici, nous transmettons le port 2222 du serveur distant au port 22 de la machine locale (et c’est là que vous devez démarrer le serveur SSH local sur le port 22; s’il écoute sur un autre port, utilisez-le au lieu de 22).
Maintenant, lancez simplement scp
sur un serveur distant et copiez notre fichier sur le port 2222 du serveur distant mappé sur le port 22 de notre ordinateur local (où notre sshd
locale est en cours d'exécution).
remote $ scp -P2222 abc.txt [email protected]:
[email protected]'s password:
abc.txt 100% 4 0.0KB/s 00:00
Nous avons fini!
remote $ exit
logout
Connection to example.com closed.
local $ cat abc.txt
abc
Difficile, mais si vous ne pouvez vraiment pas exécutez simplement scp
depuis un autre terminal, pourrait vous aider.
J'ai trouvé cette solution one-liner sur SU d'être beaucoup plus simple que la réponse acceptée. Puisqu'il utilise une variable d'environnement pour l'adresse IP locale, je pense qu'il répond également à la demande de l'OP de ne pas le savoir à l'avance.
sur cette base, voici une fonction bash permettant de "télécharger" un fichier (c'est-à-dire transmettre depuis une session SSH vers un emplacement défini sur la machine locale)
function dl(){
scp "$1" ${CLIENT_IP%% *}:/home/<USER>/Downloads
}
Maintenant, je peux simplement appeler dl somefile.txt
pendant que SSH entre dans la télécommande et somefile.txt
apparaît dans mon dossier Téléchargements local.
extras:
Remarque: cela nécessite un accès SSH à la machine locale depuis la télécommande (est-ce souvent le cas pour quelqu'un?)
Vous auriez besoin d'un serveur ssh local s'exécutant sur votre machine, alors vous pouvez simplement:
scp [-r] local_content your_local_user@your_local_machine_ip:
Quoi qu'il en soit, vous n'avez pas besoin de fermer votre connexion à distance pour en faire une copie à distance, ouvrez simplement un autre terminal et exécutez scp.