Copier un fichier sur le système local avec ssh

258

Si je suis connecté à un système via SSH, existe-t-il un moyen de copier un fichier dans mon système local sans déclencher un autre terminal ou une session écran et effectuer scp ou quelque chose de similaire ou sans effectuer de SSH depuis le système distant vers le système de stockage distant? système local?

Shawn J. Goff
la source
4
Si vous avez un serveur ssh sur votre client, vous pouvez toujours essayer scp file.foo [email protected]:file.foo: P
rahmu
4
Bien sûr, mais je ne veux pas autoriser l'accès à mon ordinateur à partir d'un serveur appartenant à une entreprise pour laquelle je travaille :) Je n'ai qu'une authentification basée sur une clé ici de toute façon, et il ne serait pas trop sûr de mettre ma clé privée sur le serveur!
Naftuli Kay
2
Je ne comprends pas votre problème. Générez une nouvelle paire de clés, copiez la partie publique sur vos ordinateurs registered_keys et, après votre transfert, supprimez à nouveau cette ligne.
Nils
8
Je le fais souvent, il serait donc inefficace de le faire chaque fois que je veux copier un fichier au milieu d'une session SSH. Pendant une session de terminal SSH, je cherche simplement un moyen de se reconnecter à mon ordinateur local et de le faire envoyer un fichier au serveur distant sans avoir à quitter la session SSH en cours.
Naftuli Kay
2
Le problème est que la connexion ssh initiale peut être pénible (2fa ou d’autres défis au-delà de la clé ou du mot de passe), nous n’avons peut-être pas les privilèges nécessaires pour changer la configuration du serveur ssh, il n’ya aucune raison de faire la négociation de clé plusieurs fois, et qu’une fois que nous aurions une session, il serait bien de l’utiliser pour plusieurs choses.
duanev

Réponses:

139

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 votre ~/.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 avec la même connexion (utilisateur, port, machine) qu'une connexion existante, la seconde 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 une connexion active, vous pouvez rapidement:

Expéditeur

Sur une connexion existante, vous pouvez établir un tunnel ssh inversé. Sur la ligne de commande ssh, créez un transfert à distance en passant, -R 22042:localhost:22où 22042 est un numéro choisi au hasard, différent de tout autre numéro de port de la machine distante. Ensuite, ssh -p 22042 localhostsur la machine distante, vous êtes connecté à la machine source. vous pouvez utiliser scp -P 22042 foo localhost:pour copier des fichiers.

Vous pouvez automatiser cela davantage avec RemoteForward 22042 localhost:22. Le problème, c'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é le 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 existe également des informations intéressantes dans ce fil de défaillance de serveur .

Copier coller

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

remote.example.net $ base64 <monfichier
 (copie le résultat)
local.example.net $ base64 -d> myfile
 (collez le contenu du presse-papiers)
Ctrl +D

De manière plus pratique, 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 xclipou 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 -
Gilles
la source
Si nous pouvons transférer des fichiers en utilisant SSH, pourquoi les gens ont-ils encore besoin de / utiliser SFTP?
Pacerier
3
@Pacerier Parce que SFTP est un moyen de transférer des fichiers en utilisant SSH.
Gilles
Pourquoi les gens ont-ils même besoin de SFTP s'ils peuvent transférer des fichiers à l'aide de SSH sans SFTP?
Pacerier
La méthode copier-coller est particulièrement pratique avec les connexions chaînées (c.-à
d
1
@Pacerier SFTP a quelques commandes supplémentaires telles que lister des fichiers ou supprimer un fichier distant, etc.
rahmu
68

Un autre moyen simple (IMO) 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 les ont dans leurs systèmes d’emballage mc.

Florian Fida
la source
8
Honnêtement, je ne comprends pas pourquoi cela n’est pas voté. OP a demandé une solution sans scp. Parfois, en particulier dans mon cas où je suis connecté à un routeur fourni par un fournisseur de services Internet très handicapé, je n'ai pas le protocole sftp, je n'ai pas le protocole scp, et même le protocole ftp est gravement endommagé. Je savais que je pouvais le faire, je suis juste venu ici pour m'assurer que ma syntaxe était la bonne.
Auspex
1
Brillant! mcest le plus rapide à utiliser.
Namek
2
En fait, cette solution ne fonctionne pas dans mon cas. Avec un tunnel créé de Windows à Linux, vous commencez dans du mastic, pas un terminal. Cette méthode est exactement ce que je voulais, mais je ne peux pas l'utiliser. Agacé.
Benjamin
1
La raison pour laquelle je ne vote pas, c'est parce que cela ne fonctionnera pas si la machine cliente est derrière un routeur partagé (comme un réseau d'entreprise). Supposons que je suis sur un ordinateur de travail et que j'ai ssh'd sur mon serveur domestique. Comment puis-je copier un fichier sur mon ordinateur de travail après avoir traversé la peine de passer à travers des répertoires complexes avec des espaces et des caractères spéciaux?
Sridhar Sarnobat
1
Cela fonctionne bien avec les données binaires. Je fais cela avec des tgzfichiers tout le temps :)
Florian Fida
53

SSH supporte 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 !argssemble être le plus proche de ce que vous voulez. Notez que vous devez avoir PermitLocalCommandactivé votre /etc/ssh_configfichier pour que les ~Ccommandes fonctionnent (voir man ssh_config).

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

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

techniquement, vous n'avez jamais quitté la session SSH et n'avez pas besoin de vous authentifier à nouveau. Probablement plus compliqué que vous voudriez, mais je ne peux pas penser à un autre moyen facile.

Corey Henderson
la source
Est-ce que ça marche encore? Je n'ai pas trouvé !argsde message d'aide.
xuhdev
@xuhdev il est toujours là sur OpenSSH_7.2p2, argsn'est pas dans le premier message d'aide ( ~?), mais dans le second (une fois que vous entrez l' ssh>invite avec ~C, vous pouvez taper helpà l' ssh>invite)
sdaau
Cela semble être une bonne solution (même si je ne l’ai pas essayée), je n’avais pas réalisé que vous pouviez obtenir un tampon de ligne de commande parent, style vim. En pratique, on peut simplement préférer ouvrir un nouvel onglet de terminal pour ne pas oublier comment revenir dans la session (comme quand je ne me souviens jamais comment quitter emacs).
Sridhar Sarnobat
37

Ce sont toutes des méthodes très compliquées.
Vous pouvez monter le système de fichiers distant sur votre ordinateur local 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, Dauphin, Bash ou autre.

Dilemme
la source
4
Connexion avec un fichier de clé:sshfs -oIdentityFile=~/.ssh/keyfile.pem [email protected]:/ /mnt/sshfs/
sshow
15
  • Utilisez ssh-xfer , un agent ssh modifié qui surcharge efficacement un canal latéral ssh existant à des fins de transfert de fichiers.
  • Utilisez zssh , qui est effectivement zmodem sur ssh. Si vous avez déjà utilisé rzsz, cela vous semblera très familier.
  • Les ports inversés ( -Rpour les connexions distantes ou locales) ou -Lles ports de transfert ( pour les applications locales à distantes) permettent le transfert de fichiers, en supposant qu'un démon de transfert de fichiers est à l'écoute de l'autre côté.

Mais rien de tout cela n’est vraiment nécessaire, IMO. 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 ControlMasteret ControlPath mis en place ( ControlPersistest utile aussi),

  # première connexion
$ ssh à distance

  # va multiplexer sur la même connexion le ssh original ouvert
$ sftp à distance
éphémère
la source
5
zmodem me rappelle le téléchargement du dernier shareware à partir du BBS local .. :-)
Stuart Woodward
La méthode xfer correspond exactement à ce que je recherchais, mais savez-vous pourquoi le correctif ssh-xfer n’est pas inclus dans OpenSSH en amont? Une flamme?
Ferran Basora
Merci pour zssh allusion! J'utilise tmux dans Konsole et à cause de tmux, mon "sz" du serveur ne fonctionne plus. Le zssh résout mes problèmes!
0xAF
9

Une approche encore plus simple: ouvrez Filezilla (ou votre navigateur ftp préféré), ouvrez une connexion SSH au même site, trouvez le fichier et faites-le glisser dans votre structure de fichier locale. Si vous débutez avec 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 de discussion à la recherche d'une solution de terminal uniquement ont peut-être oublié l'évidence.

Larry Jones
la source
Oui, ou sftp comme suggéré ici .
atomicules
Je crois que le serveur FileZilla est uniquement Windows. Le client est multi-plateforme cependant
Freedom_Ben le
Vous pouvez même utiliser Caja, ouvrez simplement ssh://SERVER.
basic6
8

Ce que j’ai trouvé être la solution la meilleure et la plus efficace est d’utiliser xclip-copyfileet xclip-pastefile.

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

Cela évite d’utiliser scpou d’avoir un serveur ssh local. Je l'utilise avec cygwin par exemple. Le seul problème est que cela nécessite une installation xclipsi vous ne l'avez pas déjà. Oh, et cela fonctionne aussi avec les fichiers binaires.

Robert
la source
Wow, cela pourrait être une meilleure solution que mon transfert de port inversé avec netcat.
Sridhar Sarnobat
3

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

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

SecureCRT présente trois fonctionnalités principales pour le transfert de fichiers depuis et vers un système sur lequel vous êtes SSH:

  • ZModem , YModem , XModem , Kermit et ASCII - SecureCRT est un émulateur de terminal classique qui prend en charge plusieurs protocoles de transfert de fichiers dans la bande.

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

    Une bonne idée est que le répertoire de téléchargement est personnalisable par session. Nous utilisons cela pour créer des répertoires par site sur le serveur de fichiers de notre bureau principal, ce qui évite de trier manuellement les fichiers téléchargés.

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

  • SFTP - SecureCRT a une implémentation SFTP de base étroitement intégrée.

    Par "étroitement intégré", j'entends par là que lorsque vous donnez la commande de menu ou le raccourci clavier SFTP, un nouvel onglet connecté au site distant s'ouvre via la même connexion SSH. Par conséquent, 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 fonctionnalité SFTP comme "de base", car VanDyke Software dispose d’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 fonctionnalité SFTP de SecureCRT vous permet de configurer des répertoires local et distant par défaut, distincts de la configuration de ZModem.

    Cette fonctionnalité SFTP a une sorte d’interface de base en ligne de commande, imitant le sftpprogramme d’OpenSSH , à ceci près qu’elle présente des avantages tels que l’ Tabachèvement de la commande. Ainsi, récupérer un fichier distant appelé somefile.tar.gzpeut être aussi simple que get soTabEnter.

  • Glisser-déposer - Si vous glissez-déposez un fichier dans la fenêtre du terminal, celui-ci tape automatiquement rzpour vous et commence à envoyer le fichier.

    Vous pouvez également 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, glisser , déposer .

    Nous constatons que les transferts se font beaucoup plus rapidement via SFTP, probablement parce que c'est un protocole basé sur TCP, donc il tire parti des grandes fenêtres coulissantes des piles TCP / IP modernes . 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 d'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 évite l’utilisation de ZModem. Lorsque vous tapez rzsur le système distant, SecureCRT affiche automatiquement un sélecteur de fichiers. Vous avez alors environ une minute pour rechercher et sélectionner le fichier avant que le côté distant n'expire. Cela crée une ambiance de course contre la montre qui n’est pas agréable. Glisser-déposer vous permet de trouver le fichier à votre guise, puis de lancer le transfert d'un simple mouvement rapide de la souris.

    Nous utilisons toujours la méthode manuelle, en commençant le transfert avec une rzcommande explicite . Ceci est dû au fait que SecureCRT vous permet de configurer un répertoire de téléchargement par session, qui pointe vers le dossier du serveur de fichiers contenant toujours la dernière version du logiciel exécuté par le site distant en question. 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.

Warren Young
la source
1

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

Nils
la source