Copier l'entrée dans le presse-papiers via SSH?

33

Voici mon cas d'utilisation:

  • Je suis souvent connecté à d'autres ordinateurs via SSH pour le travail et j'ai souvent besoin de copier et coller des documents / du texte du serveur vers des éditeurs locaux pour l'écriture d'exemples et le partage de texte.
  • Souvent, si le texte est assez petit, je vais simplement copier le résultat de mon programme terminal (gnome-terminal pour le moment) et le coller.
  • Cependant, quand il s’agit de documents entiers, mes options sont assez limitées. Je peux soit copier le document morceau par morceau, soit le copier sur l'ordinateur scplocal.

Existe-t-il un moyen d'utiliser un programme tel que celui xclipqui me permet de copier à distance stdindans le presse-papiers du serveur X local? Quelque chose à l'effet de:

cat myconffile.conf | sed {...} | copy-over-ssh-to-local-clipboard

ce serait génial. Existe-t-il quelque chose pour rendre cela possible?

Naftuli Kay
la source

Réponses:

20

Si vous exécutez ssh avec un transfert X, cela est transparent: les commandes distantes (y compris xclip) ont accès à votre serveur X (y compris son clavier). Assurez-vous que vous avez ForwardX11 yesdans votre ~/.ssh/configet X11Forwarding yessur le serveur sshd_config(en fonction de vos distributions, ces options peuvent être activées ou désactivées par défaut).

<myconffile.conf sed {...} | xclip -i

Il existe d'autres méthodes de travail sur les fichiers distants qui peuvent s'avérer plus pratiques, telles que le montage de répertoires distants sur votre ordinateur local avec SSHfs ou l'ouverture de fichiers distants dans Emacs avec Tramp . Si vous avez ssh, FUSE et SSHfs installés, SSHfs est aussi simple que mkdir ~/net/myserver; sshfs myserver:/ ~/net/myserver. Si vous avez installé ssh et Emacs, Tramp est aussi simple qu’une ouverture /myserver:/path/to/file.

Gilles, arrête de faire le mal
la source
1
Des failles de sécurité pour exécuter des choses de cette façon par défaut dans le fichier conf?
Naftuli Kay
Tout le trafic x11 est transmis via le canal SSH.
Shadur
2
@TKKocheran Pas vraiment. Du côté du serveur, aucun. Du côté des clients, un peu, dans la mesure où cela donne un accès à l’administrateur du serveur, mais dans 99% des cas, l’administrateur du serveur a un moyen de le faire; voir Si une personne est connectée à SSH sur mon ordinateur, puis-je accéder à son ordinateur?
Gilles 'SO- arrête d'être méchant'
7

Vous n'avez besoin de rien de spécial. depuis xclipfonctionne plus stdin, juste

ssh remotehost xclip < myconf.conf

Pourquoi aurait-il besoin d'être modifié avec sed? sshest transparent aux données lorsqu'il n'est pas utilisé en tant que terminal, et est couramment utilisé dans les pipelines tels que

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`
geekosaur
la source
Est-il possible de le faire à partir d'une session SSH existante? Je préférerais vraiment ne pas avoir à ouvrir une autre fenêtre de terminal si j'en ai déjà une ouverte sur la machine en question.
Naftuli Kay
Et sed` est juste là à titre d'exemple, si j'aimerais effectuer un traitement sur le stdinavant de le copier dans le presse-papiers, j'aimerais cette option.
Naftuli Kay
Non, il n'y a aucun moyen d'injecter des données dans une sshsession existante (ce ne serait pas très sécurisé si vous le pouviez). Vous pouvez configurer de manière ssh ControlMasterà multiplexer des connexions supplémentaires sur une connexion existante, mais ce n'est pas vraiment quelque chose pour les débutants et vous le faites toujours de la même manière par la suite, en basculant sur un autre terminal local et en exécutant la commande ci-dessus (ce qui n'ouvre pas une nouvelle connexion). fenêtre de terminal).
geekosaur
@NaftuliKay Pour une solution qui fonctionne dans votre session SSH normale, voir ma réponse .
tanius
5

Voici comment vous le feriez sur OSX à partir de votre ordinateur local

ssh remotehost.com "<some/file.txt" | pbcopy
William Casarin
la source
3

si votre ordinateur local exécute Windows (7+), vous pouvez simplement l'utiliser à partir de la ligne de commande:

ssh user@server cat /home/user/file | clip
d.raev
la source
1

~ / .ssh / config:

Host REMOTEHOST
    ...
    ForwardX11 yes

/ etc / ssh / sshd_config:

X11Forwarding yes

frapper:

$ xclip -o | ssh REMOTEHOST 'DISPLAY=:0 xclip -i'
superqwerty
la source
1

Très similaire aux solutions @ d-raev et @ william-casarin, cependant, c'est différent, je partage donc ce qui a fonctionné pour moi.

La commande

ssh user@host "cat <myconffile.conf" | xclip -sel clip

Explication

Cela utilise sshpour créer un tunnel sécurisé, connectez - vous à user@ hostou ip, puis exécutez catpour imprimer le contenu de <myconffile.confla stdoutpuis tuyauterie à la commande xclip -sel clipsur votre machine locale, qui place le contenu <myconffile.confdans le presse - papiers sur votre machine locale.

Exemple d'utilisation dans le monde réel

J'utilise cette structure de commande pour des tâches telles que coller des clés ssh dans github (permettant une simple sélection de ctrl-V ou coller après avoir exécuté la commande) avec Bash sous Ubuntu 16.04 et 18.04. Consultez man ssh, man catet man xclippour plus de détails sur le comportement et les options.

Jason R Stevens CFA
la source
Cela fonctionne même pour copier depuis des serveurs sans tête, où xclipne fonctionnera pas car il n’ya pas de X.
tanius
0

J'ai un problème similaire avec le lxterminalcollage du presse-papiers dans une sshsession de LUbuntu (différents terminaux testés) . Si le Presse-papiers a plus d’environ 100 octets, le délai de la session expire et échoue.

Si je me connecte via ssh à presque tous les serveurs CentOS 5.x, puis que je me connecte au serveur cible, le collage dans le presse-papiers fonctionne sans problème pour une taille de données raisonnable.

Vasyl
la source
0

Copier d'un serveur sans tête vers le Presse-papiers local, depuis votre session SSH habituelle:

  1. Installez ncatsur votre machine locale et distante. (Sur votre machine distante, vous pouvez aussi faire avec ncou en clair telnet, mais sur la machine locale, nous avons besoin des options pour exécuter des commandes ( -c/ -e) qui ne sont pas disponibles ncdans les distributions habituelles comme Debian et Ubuntu.)

    apt install nmap
    
  2. Sur votre ordinateur local, configurez un serveur d'écoute sur l'interface locale qui copiera le contenu entrant sur le port 10009 dans votre presse-papiers X:

    ncat --keep-open --listen --sh-exec "xclip -selection clipboard" localhost 10009
    

    Ou utilisez la version abrégée équivalente:

    ncat -klc "xclip -sel c" localhost 10009
    
  3. SSH sur la machine distante de sorte qu’un tunnel inverse soit établi entre le port 10008 de la machine distante et le port 10009 sur votre machine locale (sur laquelle votre serveur est à l’écoute). Vous pouvez utiliser cette session SSH pour votre travail normal.

    ssh -R 10008:localhost:10009 [email protected]
    
  4. Lorsque vous souhaitez copier le contenu d'un fichier d'une machine distante dans le presse-papier local, exécutez-le dans le shell SSH:

    ncat --send-only localhost 10008 < file.txt
    

    Et bien sûr, c’est plus agréable quand il est présenté sous forme de raccourci ou de script. Nous pourrions l'appeler rclippour "[copier dans] le presse-papier distant" par analogie avec le bien connu xclip.

Avantages

  • Pas besoin d'ouvrir une autre session SSH sur la machine distante.

  • Pas besoin de xclipsur la machine distante, donc ça marche si vous ne pouvez pas l'installer ou ne pouvez pas l'utiliser car c'est un serveur sans tête sans X.

Sécurité

Nous faisons ncat -l localhost 10009pour le serveur, ce qui signifie qu'il écoute uniquement sur l'interface réseau avec l' localhostadresse IP. Cette interface de boucle locale n'autorise que les connexions à partir de votre propre machine (y compris, dans ce cas, celles inversées par tunnel via SSH). Ainsi, même si vous n'êtes pas derrière un pare-feu, votre port 10009 n'est exposé à personne sur Internet.

La source

Adapté de gist dergachev / ssh-forward-clipboard.md pour fonctionner sous Linux. Cet élément contient également des instructions sur la manière de rendre le tunnel inverse SSH par défaut.

Tanius
la source
-1

https://secure.wikimedia.org/wikipedia/en/wiki/Base64

Vous pouvez convertir vos données du Presse-papiers avec Base64 en texte ASCII. Ensuite, vous pouvez insérer cela dans une connexion SSH déjà existante.

LanceBaynes
la source
Pourquoi se convertir à rien? Il s'agit déjà d'un texte dans ce cas et même s'il était binaire, il n'y aurait aucune raison de ne pas l'envoyer via un pipeline comme celui-ci.
Caleb
le presse-papier peut contenir des données binaires, par exemple: une application compilée
LanceBaynes
Oui, cela serait possible, mais pourquoi cela poserait-il problème? Les données binaires peuvent être transférées via un tunnel et un tunnel SSH.
Caleb