web-dev-qa-db-fra.com

Copiez un fichier sur le système local avec ssh

Si je suis connecté à un système via SSH, existe-t-il un moyen de copier un fichier sur mon système local sans lancer un autre terminal ou session d'écran et faire scp ou quelque chose de similaire ou sans faire SSH du système distant vers le système local?

271
Shawn J. Goff

Connexion maître

C'est plus facile si vous planifiez à l'avance.

Ouvrez une connexion principale la première fois. Pour les connexions suivantes, acheminez les connexions esclaves via la connexion maître existante. Dans ton ~/.ssh/config , configurez le partage de connexion pour qu'il se produise automatiquement:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Si vous démarrez une session ssh sur la même (utilisateur, port, machine) qu'une connexion existante, la deuxième session sera tunnelée sur la première. L'établissement de la deuxième connexion ne nécessite aucune nouvelle authentification et est très rapide.

Ainsi, pendant que vous avez votre connexion active, vous pouvez rapidement:

Expéditeur

Sur une connexion existante, vous pouvez établir un tunnel ssh inverse. Sur la ligne de commande ssh, créez un transfert distant en passant -R 22042:localhost:22 où 22042 est un numéro choisi au hasard qui est différent de tout autre numéro de port sur la machine distante. Alors ssh -p 22042 localhost sur la machine distante vous reconnecte à la machine source; vous pouvez utiliser scp -P 22042 foo localhost: pour copier des fichiers.

Vous pouvez automatiser davantage cela avec RemoteForward 22042 localhost:22. Le problème avec cela est que si vous vous connectez au même ordinateur avec plusieurs instances de ssh, ou si quelqu'un d'autre utilise le port, vous n'obtenez pas le transfert.

Si vous n'avez pas activé de transfert à distance depuis le début, vous pouvez le faire sur une session ssh existante. Type Enter ~C Enter -R 22042:localhost:22 Enter. Voir "Caractères d'échappement" dans le manuel pour plus d'informations.

Il y a aussi des informations intéressantes dans ce thread de panne de serveur .

Copier coller

Si le fichier est petit, vous pouvez le taper et copier-coller à partir de la sortie du terminal. Si le fichier contient des caractères non imprimables, utilisez un encodage tel que base64 .

 remote.example.net $ base64 <monfichier 
  (copier la sortie) 
 local.example.net $ base64 -d> monfichier 
  (coller le contenu du presse-papiers) Ctrl+D

Plus commodément, si le transfert X est actif, copiez le fichier sur la machine distante et collez-le localement. Vous pouvez diriger des données vers et depuis xclip ou xsel . Si vous souhaitez conserver le nom de fichier et les métadonnées, copiez-collez une archive.

remote.example.net$ tar -czf - myfile | xsel
local.example.net$ xsel | tar -xzf -

Un autre moyen (IMO) simple serait:

# to remote Host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote Host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

Ou si vous préférez quelque chose comme une interface graphique, essayez Midnight Commander . Ils appellent la fonctionnalité Shell-Link. La plupart des distributions ont em dans leurs systèmes de paquets comme mc.

75
Florian Fida

SSH prend en charge quelques commandes, via le caractère d'échappement (~ par défaut):

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
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
      !args                                  Execute local command

Le !args semble être le plus proche de ce que vous voulez. Notez que vous devrez activer PermitLocalCommand dans votre /etc/ssh_config fichier pour le ~C commandes pour fonctionner (voir man ssh_config).

Vous pouvez réutiliser la même session ssh si vous configurez un ControlMaster dans ssh_config. Si tu fais ça:

$ ~C
ssh> !scp file user@myserver:

vous n'avez techniquement jamais quitté la session ssh et n'avez pas besoin de vous ré-authentifier. Probablement plus compliqué que vous ne le souhaiteriez, mais je ne vois pas d'autre moyen facile.

54
Corey Henderson

Ce sont toutes des méthodes très compliquées.
Vous pouvez monter le système de fichiers distant sur votre machine locale avec sshfs:

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

Ensuite, vous pouvez copier coller le fichier avec nautilus, gnome, konqueror, dolphin, bash ou autre.

38
Quandary
  • Utilisez ssh-xfer , un agent ssh modifié qui surcharge efficacement un canal latéral ssh existant pour une utilisation de transfert de fichiers.
  • Utilisez zssh , qui est en fait zmodem sur ssh. Si vous avez déjà utilisé rzsz, cela vous semblera très familier.
  • Inverser (-R, pour distant vers local) ou vers l'avant (-L, pour les ports locaux à distants) sur lesquels exécuter les transferts de fichiers, en supposant que vous avez un démon de transfert de fichiers à l'autre bout.

Mais rien de tout cela n'est vraiment nécessaire, OMI. Le protocole SSH prend en charge plusieurs canaux sur une seule connexion et le client OpenSSH prend en charge le multiplexage. En supposant que vous avez ControlMaster et ControlPathset up (ControlPersist est également utile),

# première connexion
 $ ssh remote 
 
 # multiplexera sur la même connexion que le ssh d'origine ouvert
 $ sftp remote 
15
ephemient

Une approche encore plus simple: ouvrez Filezilla (ou votre navigateur ftp préféré), ouvrez une connexion ssh vers le même site, recherchez le fichier et faites-le glisser vers votre structure de fichiers locale. Si vous êtes nouveau sur Filezilla, utilisez la fonction "gestionnaire de site" pour vous reconnecter rapidement la prochaine fois.

Oui, je sais que cela est évident pour la plupart d'entre vous (et pas précisément sur le point), mais certains (comme moi) qui ont trouvé ce fil à la recherche d'une solution de terminal uniquement peuvent avoir ignoré l'évidence.

9
Larry Jones

J'ai trouvé que la solution la meilleure et la plus efficace consiste à utiliser xclip-copyfile et xclip-pastefile.

Sur le serveur, vous utilisez xclip-copyfile pour copier un ou plusieurs fichiers. Ces fichiers sont ensuite disponibles sur votre serveur local. Là, vous pouvez utiliser xclip-pastefile.

Cela contourne la nécessité d'utiliser scp ou d'avoir un serveur ssh local. Je l'utilise avec cygwin par exemple. Le seul problème est que cela nécessite d'installer xclip si vous ne l'avez pas déjà. Oh, et cela fonctionne aussi avec les fichiers binaires.

8
Robert

L'une des nombreuses raisons pour lesquelles nous utilisons SecureCRT - bien que préférant les logiciels open source lorsque cela est possible - est la facilité de transfert de fichiers. Il n'y a tout simplement pas de remplacement direct dans le monde F/OSS.

SecureCRT a commencé comme un pur programme Windows au milieu des années 1990 mais a été porté sur Mac OS X et Linux il y a quelques années .

SecureCRT a trois fonctionnalités principales pour transférer des fichiers vers et depuis un système dans lequel vous êtes SSH:

  • ZModem , YModem , XModem , Kermit et ASCII - SecureCRT est une sorte d'émulateur de terminal à l'ancienne, prenant en charge plusieurs protocoles de transfert de fichiers intrabande.

    Le plus simple à utiliser est ZModem. Lorsque vous tapez quelque chose comme sz file-to-download sur la ligne de commande distante, le programme distant sz écrit un séquence d'échappement qui indique à SecureCRT de commencer immédiatement le téléchargement file-to-download dans le répertoire de téléchargement par défaut.

    Une bonne touche est que le répertoire de téléchargement est personnalisable par session. Nous l'utilisons pour avoir des répertoires par site sur notre serveur de fichiers du bureau principal, nous n'avons donc pas à trier manuellement les fichiers téléchargés.

    (sz est le programme "send ZModem", qui fait partie du paquet lrzsz . Il est déjà emballé pour la plupart des systèmes Unixy. Si pour une raison quelconque votre système distant ne fonctionne pas pas déjà installé, et vous ne pouvez pas facilement installer un paquet binaire, le paquet source est petit et très portable. Plus d'une fois, j'ai dû envoyer un lrzsz"sharchive " ou uuencode 'd tarball vers un système distant allégé pour que je puisse y mettre des fichiers ZModem.)

  • [~ # ~] sftp [~ # ~] - SecureCRT a une implémentation SFTP de base étroitement intégrée.

    Par "étroitement intégré", je veux dire que lorsque vous donnez la commande de menu SFTP ou le raccourci clavier, il ouvre un nouvel onglet connecté au site distant via la même connexion SSH. Ainsi, vous n'avez pas besoin de vous reconnecter et la connexion est établie un peu plus rapidement que si vous aviez ouvert une connexion SFTP distincte sur le même serveur.

    Je caractérise la fonction SFTP comme "de base", car VanDyke Software a un produit de transfert de fichiers distinct, SecureFX . Il est plus fonctionnel que le client SFTP intégré et s'intègre également à SecureCRT.

    La fonction SFTP de SecureCRT vous permet de configurer les répertoires local et distant par défaut qui sont distincts de la configuration ZModem.

    Cette fonctionnalité SFTP a une sorte d'interface de ligne de commande de base, imitant le programme sftp d'OpenSSH, sauf qu'elle a des avantages comme Tab achèvement de la commande. Ainsi, la récupération d'un fichier distant appelé somefile.tar.gz pourrait être aussi simple que get soTabEnter.

  • Glisser-déposer - Si vous glissez-déposez un fichier sur la fenêtre du terminal, il tape automatiquement rz pour vous et commence à envoyer le fichier.

    Alternativement, vous pouvez ouvrir un onglet SFTP et déposer un fichier sur cet onglet pour l'envoyer via SFTP. Ainsi, l'envoi d'un fichier à un système distant pourrait être aussi simple que Alt-P, faites glisser, déposez.

    Nous constatons que les transferts se produisent beaucoup plus rapidement via SFTP, probablement parce que c'est un protocole basé sur TCP, il bénéficie donc des grandes fenêtres coulissantes modernes piles TCP/IP . ZModem a été conçu à l'époque où une taille de bloc de 64 Ko était considérée comme "grande". Ainsi, une grande partie de la vitesse potentielle dans une liaison est absorbée dans ZModem pendant que chaque extrémité attend des accusés de réception de transfert de bloc.

    Une bonne chose à propos du mode de fonctionnement glisser-déposer est qu'il supprime l'une des contraintes liées à l'utilisation de ZModem. Lorsque vous tapez rz sur le système distant, SecureCRT affiche automatiquement un sélecteur de fichiers. Vous avez ensuite environ une minute pour rechercher et sélectionner le fichier avant l'expiration du côté distant. Cela crée une ambiance de course contre la montre qui n'est pas agréable. Le glisser-déposer vous permet de trouver le fichier à votre guise, puis de démarrer le transfert d'un simple mouvement rapide de la souris.

    Nous utilisons toujours la méthode manuelle, en commençant le transfert avec une commande explicite rz. En effet, SecureCRT vous permet de configurer un répertoire de téléchargement par session, que nous pointons sur le dossier du serveur de fichiers qui contient toujours la dernière version du logiciel que ce site distant particulier exécute. Pour de tels transferts, il n'y a pas de course contre la montre, car le sélecteur de fichiers s'ouvre au bon endroit pour commencer.

3
Warren Young

Utilisation "!" pour convertir le fichier en une représentation ASCII de votre fichier (par exemple ! uuencode myfile.bin >uuencode.dat). Utilisez ensuite ! cat uuencode.dat >target.dat. Après cela, utilisez uudecode du côté cible: ! uudecode target.dat >myfile.bin

1
Nils