web-dev-qa-db-fra.com

Comment faire pour revenir au local quand j'ai déjà ssh en machine distante?

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?

19
laike9m

É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.

23
afenster

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:

  • J'utilise des clés rsa (ssh-copy-id) pour contourner le mot de passe
  • J'ai trouvé cette astuce pour éviter que la base de données locale ne provienne de l'appel scp

Remarque: cela nécessite un accès SSH à la machine locale depuis la télécommande (est-ce souvent le cas pour quelqu'un?)

0
brotherJ4mes

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.

0
Javier S.