Télécharger un fichier sur une session SSH active

86

Je souhaite télécharger un fichier à partir d'une session SSH active. Dans de nombreux cas , je probablement pourrais juste utiliser SFTP, scp, rsyncet al , mais il y a des moments où j'ai des autorisations élevées sur le serveur distant d'une manière que je ne peux pas utiliser ces méthodes.

Si vous avez du mal à comprendre ce que je veux dire, imaginez que vous vouliez télécharger quelque chose à partir de /root/ou /var/log/auth.log. La connexion root est désactivée (car nous ne sommes pas des idiots). Comment obtenez-vous ce fichier? Copiez-le dans un endroit moins protégé, puis déplacez-le? C'est maladroit. Il existe également des scénarios dans lesquels le chemin d'accès distant est complexe ou temporaire, ou même s'il ne s'agit pas d'un chemin d'accès, car je souhaite que la sortie d'une commande distante soit stockée localement. Stocker à distance, puis copier? Clunk!

Il existe plusieurs manières plus maladroites d’obtenir des versions de celles-ci, mais dans un monde idéal, j’aurais quelque chose qui ressemble à un accès en écriture local à partir du 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 l'accès bidirectionnel ne serait pas une mauvaise chose.


Cela fait huit longues années que je ne pose pas cette question et nous avons constaté une véritable gamme de problèmes, mais cela reste un problème avec lequel je suis toujours aux prises avec des difficultés.

J'ai reformulé la question en quelque chose de beaucoup plus idéaliste. Je comprends tout à fait qu’il n’existe peut-être pas actuellement de réponse parfaite. Tous les efforts passés et futurs vers mon idéal sont appréciés.

Oli
la source
1
Question interessante! Cela montre vraiment comment les idées des gens sur ce qu’il est raisonnable de faire sont façonnées par les outils qu’ils utilisent. zsshest probablement le plus proche du flux de travail semblable à zmodem dont vous vous souviendrez peut-être.
poolie
1
Je suis vraiment surpris de voir que, même après 8 réponses, il n'y a pas vraiment de moyen de le faire
endolith

Réponses:

34

Vous voudrez peut-être consulter zssh , disponible dans l’univers et donc disponible avec

sudo apt-get install zssh

Vous en avez besoin sur votre serveur Ubuntu et sur votre client, mais lorsque vous êtes connecté avec zssh, il vous suffit d'appuyer sur 'ctrl- @' pour afficher le «mode de transfert de fichier», qui vous permet de renvoyer des fichiers client, ou téléchargez-les du client au serveur.

Cependant, vous n'avez pas à réautoriser ou ouvrir une nouvelle fenêtre pour scp.

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

[enter]~[ctrl]-Z

Quel sera le fond ssh, puis juste scp $!:/whatever/whatever .'

Une fois le fichier transféré, fgpour récupérer 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 compliqué, vérifiez man ssh_config

SpamapS
la source
24

En supposant que vous exécutiez un serveur ssh sur votre bureau (il existe des solutions, mais je pense qu'elles ajoutent toutes de la complexité, voire des problèmes de sécurité), vous pouvez configurer un tunnel ssh inversé. Voir SSH copier facilement le fichier sur le système local. plus à unix.SE .

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

Les séquences d'échappement Ssh commencent par ~; le tilde n'est reconnu qu'après une nouvelle ligne. ~ Ctrl+Zmet ssh à l'arrière-plan. ~Centre une ligne de commande où vous pouvez créer ou supprimer un transfert.

Gilles
la source
1
Utiliser 2 couches de cryptage et de compression est un peu excessif, c'est pourquoi j'ai suggéré d'utiliser rsh ou ftp pour le "lien retour".
Janv
2
@JanC: Cela nécessite plus de configuration: vous devez installer un serveur rsh ou ftp et vous assurer que sa configuration est sécurisée. La surcharge du cryptage est minime, même sur un netbook.
Gilles
Un serveur ssh n'est pas installé par défaut non plus. ;)
janvier
@JanC: Un autre avantage de ssh est que si vous avez activé le transfert d'agent, vous n'avez pas besoin de saisir un mot de passe pour effectuer la copie. Efficacité du flux de travail sur la micro-efficacité informatique.
Gilles
Vous pouvez bien sûr faire quelque chose comme ça avec (certains) autres services. Dans tous les cas, il existe de nombreuses solutions similaires qui impliquent toutes la configuration d'une connexion par tunnel et d'un démon supplémentaire ...;)
janv
10

Je suis venu avec un moyen de faire cela avec SSH standard. C'est un script qui duplique la connexion ssh actuelle, trouve votre répertoire de travail sur la machine distante et copie le fichier que vous spécifiez sur la machine locale. Il nécessite 2 très petits scripts (1 distant, 1 local) et 2 lignes dans votre configuration 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 à machineX ouverte, vous n’avez pas besoin de mots de passe pour en ouvrir un autre.

  2. Créez un script d’une ligne sur la machine distante appelé ~/.grabCat.sh

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

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. et créez un alias pour grab.sh dans ( ~/.bashrcou ailleurs):

    alias grab=~/.grab.sh
    

C'est tout, tout est fait. Maintenant, si vous êtes connecté à machineX:/some/directory, allumez un nouveau terminal et tapez

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 en tant que troisième argument à "saisir".

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

sebix
la source
Intéressant, pourriez-vous expliquer comment cela fonctionne? Êtes-vous en mesure d'étendre cette fonctionnalité pour prendre en charge la "mise" de fichiers ainsi que leur récupération?
Peter Gibson
5

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

scp myfile machineA:

Copies myfilesur MachineB dans mon répertoire personnel MachineA sur machineA. Cela suppose que l'ID utilisateur / mot de passe sont les mêmes.

scp myfile machineA:/newdir/newname

Copie d’ myfileune /newdir/newnamemachineB sur une machineA. Cela suppose que l'ID utilisateur / mot de passe sont les mêmes.

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

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

Si l'ID utilisateur / mot de passe ne sont pas identiques, utilisez:

scp myfile user@MachineA: obtenir un fichier.

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

NOTES à propos de SCP:

Tout comme la cpcommande, l' scpoption -p permet de propager les paramètres d'autorisation du fichier d'origine vers la copie (sinon, la copie est effectuée avec les paramètres normaux des nouveaux fichiers), et l'option -r de copier une arborescence de répertoires complète avec un seul. commander.

scpcrée un canal de données crypté complètement transparent entre les deux machines, de sorte que les données binaires (telles que les images ou les programmes exécutables) sont conservées correctement. Cela signifie également qu’il scpest impossible d’effectuer une conversion automatique de la terminaison de fin de ligne entre différents types de systèmes d’exploitation, comme cela est possible avec ftp en mode "ascii". Cela ne posera pas de problème lors de la copie entre systèmes Unix, qui utilisent tous la même convention de fin de ligne.

LukeInDC
la source
2

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

entrez la description de l'image ici

jet
la source
2
Cela gagnerait à plus de détails, y compris comment se connecter à un serveur SSH avec FileZilla (ce n'est pas évident). Des captures d'écran peuvent également aider, en plus du texte explicatif .
Eliah Kagan
2

Si votre fichier est suffisamment petit, vous pouvez le coder avec base64 puis le décoder localement:

remote.example.net $ base64 <monfichier
 (copie le résultat)
local.example.net $ base64 -d> myfile
 (copier le résultat)
Ctrl +D

Réponse originale d'où je viens (et testé) auprès de: https://unix.stackexchange.com/a/2869/194134

Wesalius
la source
Qu'est-ce que cela a à voir avec quoi que ce soit? Vous n'avez pas besoin d'encoder des fichiers pour les transformer en txfr avec scp, etc.
HörmannHH
1

Ce n'est pas sur la connexion SSH active, mais scp copie les fichiers en utilisant les mêmes mécanismes et autorisations que ssh.

msw
la source
4
Je suis au courant de SCP, mais c'est un flux de travail très décousu. Si je travaille dans un répertoire distant donné, je dois obtenir le chemin distant, me déconnecter (ou créer un autre shell), effectuer l'écriture en écrivant les chemins, puis se reconnecter. Je cherche quelque chose qui s'apparente à écrire get fileet qui apparaît comme par magie sur ma machine locale. Si cela doit se faire via un service tunnellisé sur SSH, qu’il en soit ainsi .. Mais il devrait être lié à une session.
Oli
De plus, il a été remplacé par sftp (voir ma réponse)
Olivier Lalonde
@Oli - Étant donné que les deux extrémités de la transaction sont des boîtes * nix, elles sont probablement en sshdcours d' exécution. Vous devriez donc pouvoir utiliser scpla ligne de commande du serveur pour renvoyer des fichiers au client. Il y a seulement tellement de magie à faire; il faut parfois appuyer sur les boutons. La solution FileZilla est également pratique.
zerobandwidth
1

Ce n'est pas possible avec une session ssh par défaut, mais vous pouvez utiliser un script à la place de ssh, qui démarre comme un simple serveur ftp ou rsh sur votre système local et exécute ssh avec les options nécessaires pour reconfigurer un tunnel sur votre bureau. pour vous connecter à ce serveur.

JanC
la source
Ou pourrait simplement scp / rsync ...
HörmannHH
1

konsole a cette possibilité via le menu "Edition-> ZModem Upload" pendant que vous êtes dans une session à distance (ou Ctrl-Alt-U).

Remarque: le paquet lrzszdoit être installé en premier. Pour moi, cela ne fonctionne que pour le téléchargement de fichiers ASCII.

jet
la source
0

Étant donné que vous vous connectez à partir d’un ordinateur de bureau, je suppose que vous pouvez ouvrir un deuxième terminal.

Voici comment je fais souvent:

  • depuis le premier terminal, celui où la session ssh est en cours d'exécution, je reçois le chemin complet du fichier dont j'ai besoin, à l'aide de realpath myfileou de readlink -f myfile( ou des versions plus anciennes d'Ubuntu ne préinstallent pas realpath) et je le copie.
  • à partir du deuxième terminal que j'utilise scpou sftppour obtenir le fichier, en collant le chemin complet que j'avais auparavant. Par exemple:scp user@host:/etc/some/file ./

C'est assez basique, mais c'est aussi facile à retenir et n'a besoin d'aucun paquet supplémentaire pour fonctionner.

obtenir le chemin complet du premier terminal, puis coller dans le deuxième terminal

gerlos
la source
Le problème posé par la question "ne permet pas de résoudre le problème" essayer d'obtenir un fichier racine et se connecter directement par root. "
Oli
0

Étonnamment, je ne vois aucune mention du bon vieux commandant de minuit ici. À mon sens, c’est probablement le gestionnaire de fichiers le plus universel et le plus utile pour un shell doté de capacités puissantes, l’un des outils "indispensables" pour le boîtier, qui vous permet également de vous connecter via SSH, FTP, SFTP, etc. Dans le second panneau, vous pouvez ouvrir n’importe quel autre système de fichiers (votre local) et travailler ainsi librement avec les fichiers.

Tout ce dont vous avez besoin est: apt-get install mc (from universe)

Après cela, lancez mc, ouvrez le menu du panneau de gauche ou de droite, choisissez une connexion shell, entrez nomutilisateur @ remote-ip, le mot de passe - en fait, c'est tout .. copiez (ici: téléchargez) les fichiers / dossiers d'un ordinateur à un autre avec F5, déplacez-vous avec F6, etc. conformément aux boutons ci-dessous. Pour les anciens utilisateurs de MS: comme dans NC pour DOS

Nex0
la source
-2

Pensez-y, chers amis. Je cherchais toutes les réponses profondes, sombres et complexes. En fin de compte, vous pouvez le faire directement à partir de Dolphin. poisson: // nom d'utilisateur @ serveur: port

Victor
la source
Je ne comprends pas
Pierre.Vriens
Je ne pense pas que vous compreniez mon cas d'utilisation. Je suis dans une session de ligne de commande SSH active et je veux renvoyer un fichier sur mon ordinateur local depuis un emplacement [potentiellement privilégié, c'est-à-dire non disponible sur SFTP]. Ce n'est peut-être même pas un fichier à l'origine, mais une sortie de commande. Je cherche un moyen de le réacheminer sans créer de fichiers intermédiaires ni démarrer de nouvelles sessions SFTP / SCP / etc.
Oli