96 votes

Télécharger un fichier au cours d'une session SSH active

Je veux télécharger un fichier à partir d'une session SSH active. Dans de nombreux cas, je dois probablement pourrait utilisez simplement SFTP, scp , rsync et autres, mais il arrive que je dispose d'autorisations élevées sur le serveur distant, de sorte que je ne peux pas utiliser ces méthodes.

Si vous avez du mal à comprendre ce que je veux dire, imaginez que vous souhaitiez télécharger quelque chose de /root/ o /var/log/auth.log . La connexion à la racine est désactivée (parce que nous ne sommes pas idiots). Comment récupérer ce fichier ? En le copiant dans un endroit moins protégé, puis en le déplaçant ? C'est un peu compliqué. Il y a aussi des scénarios où le chemin distant est complexe ou temporaire, ou n'est même pas un chemin parce que je veux que la sortie d'une commande distante soit stockée localement. Stocker à distance, puis copier ? Maladroit !

Il y a plusieurs façons plus maladroites de réaliser ces versions, mais dans un monde idéal, j'aurais quelque chose de semblable à un accès local en écriture depuis le serveur distant, en utilisant la session SSH existante comme conduit. Quelque chose comme (c'est juste une impression d'artiste) :

$oli@remote: cp /root/cheesecake /local/

Et il apparaît juste dans mon local cwd . Et un accès bidirectionnel ne serait pas une mauvaise chose.


Huit longues années se sont écoulées depuis que j'ai posé cette question et nous avons vu une véritable gamme de clunk, mais cela reste un problème avec lequel je me débats encore de temps en temps.

J'ai reformulé la question en quelque chose de beaucoup plus idéaliste. Je comprends parfaitement qu'il n'y a peut-être pas de réponse parfaite actuellement. Tous les efforts passés et futurs pour atteindre mon idéal sont appréciés.

38voto

Jeremy Ruten Points 59989

Vous pouvez consulter zssh qui est disponible en univers, et donc disponible avec

sudo apt-get install zssh

Vous en avez besoin sur votre serveur ubuntu et sur votre client, mais en gros, lorsque vous vous connectez avec zssh, il vous suffit d'appuyer sur 'ctrl-@' et cela fait apparaître le "mode de transfert de fichiers" qui vous permet de renvoyer des fichiers par le tuyau vers votre machine cliente, ou de les télécharger du client vers le serveur.

Cependant, vous n'avez pas besoin de vous ré-authentifier ou d'ouvrir une nouvelle fenêtre pour scp.

Si vous utilisez des clés ssh et un agent ssh, vous pouvez le faire très facilement :

[enter]~[ctrl]-Z

Ce qui va fonder ssh, et ensuite juste scp $!:/whatever/whatever .'

Une fois le fichier transféré, fg pour récupérer le ssh.

Si vous n'utilisez pas de clés ssh, vous pouvez toujours utiliser les options "ControlMaster" et "ControlPath" ajoutées aux versions récentes d'OpenSSh, mais cela devient délicat, vérifiez man ssh_config.

25voto

Schof Points 952

En supposant que vous exécutez un serveur ssh sur votre bureau (il existe des moyens de contourner ce problème, mais je pense qu'ils ajoutent tous de la complexité, et peuvent avoir des problèmes de sécurité), vous pouvez configurer un tunnel ssh inverse. Voir SSH permet de copier facilement un fichier sur le système local. chez unix.SE .

  • Type Enter ~C Enter -R 22042:localhost:22 Enter pour créer une redirection de port inverse de votre serveur vers votre bureau (22042 peut être n'importe quel numéro de port entre 1024 et 65534 qui n'est pas utilisé).
  • Puis scp -P 22042 foo localhost: copiera le fichier foo dans votre répertoire courant sur le serveur vers votre domicile sur le bureau.
  • Maintenant, déplacez le fichier dans votre répertoire courant sur le bureau en tapant Enter ~ Ctrl + Z mv ~/foo . Enter fg Enter .

Séquences d'échappement Ssh commencer par ~ ; le tilde n'est reconnu qu'après une nouvelle ligne. ~ Ctrl+Z met ssh en arrière-plan. ~C entre dans une ligne de commande où vous pouvez créer ou supprimer une redirection.

11voto

J'ai trouvé un moyen de le faire avec le ssh standard. C'est un script qui duplique la connexion ssh actuelle, trouve votre répertoire de travail sur la machine distante et recopie le fichier que vous spécifiez sur la machine locale. Il nécessite 2 très petits script (1 distant, 1 local) et 2 lignes dans votre config ssh. Les étapes sont les suivantes :

  1. Ajoutez ces 2 lignes à votre ~/.ssh/config :

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p

    Maintenant, si vous avez une connexion ssh à la machineX ouverte, vous n'aurez pas besoin de mots de passe pour en ouvrir une autre.

  2. Faites un script de 1 ligne sur la machine distante appelé ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
  3. Faites un script sur la machine locale appelé ~/.grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
  4. et faire un alias pour grab.sh dans ( ~/.bashrc ou autre) :

    alias grab=~/.grab.sh

C'est tout, tout est fait. Maintenant, si vous êtes connecté à machineX:/some/directory il suffit de lancer un nouveau terminal et de taper

grab machineX filename

Cela place le fichier dans votre répertoire de travail actuel sur la machine locale. Vous pouvez spécifier un emplacement différent comme troisième argument de "grab".

Note : Il est évident que les deux scripts doivent être "exécutables", c'est-à-dire chmod u+x filename .

5voto

Schnouki Points 2872

Si votre machine cliente (la machine sur laquelle vous êtes assis) s'appelle machineA et la machine sur laquelle vous êtes actuellement connecté en SSH s'appelle machine B. MachineA, votre machine locale doit avoir SSHD en cours d'exécution et le port 22 ouvert. Ensuite :

scp myfile machineA:

Copies myfile sur la machine B vers mon répertoire personnel sur la machine A. Cela suppose que l'identifiant et le mot de passe sont les mêmes.

scp myfile machineA:/newdir/newname

Copies myfile une MachineB à /newdir/newname sur la machineA. Cela suppose que l'identifiant et le mot de passe sont les mêmes.

scp MachineA:/path/to/my/otherfile . 

Obtient une copie de otherfile de mon répertoire MachineA sur la MachineA et le place dans mon répertoire de travail actuel sur la MachineB (désigné de manière standard UNIX par le caractère "point" (.)). Cela suppose que l'identifiant et le mot de passe sont les mêmes.

Si l'identifiant et le mot de passe ne sont pas les mêmes, utilisez :

scp myfile user@MachineA: pour obtenir le fichier.

scp user@MachineA:/path/to/my/otherfile . pour mettre des fichiers

NOTES sur SCP :

Tout comme le cp commandement, scp possède une option -p pour propager les paramètres d'autorisation du fichier original à la copie (sinon la copie est faite avec les paramètres normaux pour les nouveaux fichiers), et une option -r pour copier une arborescence entière de répertoires avec une seule commande.

scp crée un canal de données cryptées totalement transparent entre les deux machines, de sorte que les données binaires (telles que les images ou les programmes exécutables) sont préservées correctement. Cela signifie également que scp est incapable d'effectuer une conversion automatique de la terminaison de fin de ligne entre différents types de systèmes d'exploitation, comme cela peut être fait avec ftp en mode "ascii". Ce ne sera pas un problème lors de la copie entre systèmes Unix, qui utilisent tous la même convention de fin de ligne.

3voto

Max Schmeling Points 6295

Si vous accédez au serveur via ssh, vous avez également la possibilité de vous connecter via sftp. Gardez le client filezilla (GUI) à portée de main et collez le chemin sur lequel vous vous trouvez actuellement.

enter image description here

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X