Comment envoyer des données au presse-papiers local à partir d'une session SSH distante

161

Question Borderline ServerFault, mais je programme des scripts shell, donc j'essaye ici d'abord :)

La plupart des * nix ont une commande qui vous permettra de rediriger / rediriger la sortie vers le presse-papiers / presse-papiers local et de la récupérer. Sous OS X, ces commandes sont

pbcopy, pbpaste 

Est-il possible de répliquer cette fonctionnalité en SSH sur un autre serveur? C'est,

  1. J'utilise l'ordinateur A.
  2. J'ouvre une fenêtre de terminal
  3. Je SSH vers l'ordinateur B
  4. J'exécute une commande sur l'ordinateur B
  5. La sortie de l'ordinateur B est redirigée ou automatiquement copiée dans le presse-papiers de l'ordinateur A.

Et oui, je sais que je pourrais simplement (frissonner) utiliser ma souris pour sélectionner le texte de la commande, mais je me suis tellement habitué au flux de travail de pipping de la sortie directement dans le presse-papiers que je veux la même chose pour mes sessions à distance.

Le code est utile, mais les approches générales sont également appréciées.

Alan Storm
la source

Réponses:

89

Je ressuscite ce fil parce que je cherchais le même type de solution, et j'en ai trouvé une qui fonctionne pour moi. C'est une modification mineure à une suggestion d' OSX Daily .

Dans mon cas, j'utilise Terminal sur ma machine OSX locale pour me connecter à un serveur Linux via SSH. Comme l'OP, je voulais pouvoir transférer de petits morceaux de texte du terminal vers mon presse-papiers local, en utilisant uniquement le clavier.

L'essence de la solution:

commandThatMakesOutput | ssh desktop pbcopy

Lorsqu'elle est exécutée dans une session ssh vers un ordinateur distant, cette commande prend la sortie de commandThatMakesOutput (par exemple, ls, pwd) et redirige la sortie vers le presse-papiers de l'ordinateur local (le nom ou l'adresse IP de "desktop"). En d'autres termes, il utilise ssh imbriqué: vous êtes connecté à l'ordinateur distant via une session ssh, vous exécutez la commande là-bas, et l'ordinateur distant se connecte à votre bureau via une session ssh différente et met le texte dans votre presse-papiers.

Cela nécessite que votre bureau soit configuré en tant que serveur ssh (que je vous laisse à vous et à Google). C'est beaucoup plus facile si vous avez configuré des clés ssh pour faciliter l'utilisation rapide de ssh, de préférence en utilisant une phrase de passe par session, ou tout ce que vos besoins de sécurité exigent.

Autres exemples:

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

Pour plus de commodité, j'ai créé un fichier bash pour raccourcir le texte requis après le tube:

#!/bin/bash
ssh desktop pbcopy

Dans mon cas, j'utilise une clé spécialement nommée

Je l'ai sauvegardé avec le nom de fichier cb (mon mnémonique (ClipBoard). Mettez le script quelque part dans votre chemin, rendez-le exécutable et voilà:

ls | cb
rhileighalmgren
la source
3
J'ai souvent à cela dans vim. Pour ce faire, sélectionnez ce que vous souhaitez copier en mode visuel, puis tapez::'<,'>w !ssh desktop pbcopy
Mike Brennan
@MikeBrennan Lorsque vous avez sélectionné le texte, pourquoi n'appuyez-vous pas simplement sur cmd + C (ou sur la touche de copie que vous avez définie)? ...
Petr Peller
36
Comme ça, cela ne fonctionne vraiment que lorsque votre bureau a une adresse IP statique et est accessible à partir de la boîte dans laquelle vous vous connectez. Ce n'est jamais le cas pour moi.
kqw
6
L'inverse ne serait-il pas plus simple? ssh user @ remote 'commandThatMakesOutput' | pbcopy
règle
J'avais besoin du -e nonedrapeau ssh décrit ici: unix.stackexchange.com/questions/210615/…
Pat Myron
122

Ma manière préférée est ssh [remote-machine] "cat log.txt" | xclip -selection c. Ceci est très utile lorsque vous ne voulez pas (ou ne pouvez pas) ssh de distant vers local.

Edit: sur Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard.

Edit: Un commentaire utile de nbren12:

Il est presque toujours possible de configurer une connexion ssh inversée en utilisant la redirection de port SSH. Ajoutez simplement RemoteForward 127.0.0.1:2222 127.0.0.1:22à l'entrée du serveur dans votre local .ssh/config, puis exécutez ssh -p 2222 127.0.0.1sur la machine distante, qui redirigera alors la connexion vers la machine locale. - nbren12

Dominykas Mostauskis
la source
6
+1: tellement plus facile que d'autres solutions lorsqu'une connexion SSH inversée n'est pas possible!
John Dibling
9
Vous méritez plus de likes pour cette solution extrêmement simple!
Kamil Dziedzic
31
Pour ceux d'entre nous sur Mac OSX,ssh [remote-machine] "cat log.txt" | pbcopy
chowey
1
Selon ce rapport ici , j'ai dû utiliser catpour que cela fonctionne sur cygwin Windows 8: ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(bien sûr, ma commande à distance ne l'était pas cat; c'était quelque chose d'autre à l'intérieur d'une machine virtuelle vagabonde, donc j'ai en fait couru vagrant ssh -c "command" | cat > /dev/clipboard)
tiby
7
Il est presque toujours possible de configurer une connexion ssh inversée en utilisant la redirection de port SSH. Ajoutez simplement RemoteForward 127.0.0.1:2222 127.0.0.1:22à l'entrée des serveurs dans votre local .ssh/config, puis exécutez ssh -p 2222 127.0.0.1sur la machine distante, qui redirigera alors la connexion vers la machine locale.
nbren12
30

Nous avons trouvé une excellente solution qui ne nécessite pas de connexion SSH inversée!

Vous pouvez utiliser xclip sur l'hôte distant, ainsi que le transfert ssh X11 et XQuartz sur le système OSX.

Pour configurer cela:

  1. Installez XQuartz (je l'ai fait avec la recette soliste + pivotal_workstation :: xquartz , mais vous n'êtes pas obligé)
  2. Exécutez XQuartz.app
  3. Ouvrez les préférences XQuartz ( kb_command+ ,)
  4. Assurez-vous que "Activer la synchronisation" et "Mettre à jour le Pasteboard lorsque le CLIPBOARD change" sont cochés Exemple de fenêtre Préférences XQuartz
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"
TrinitronX
la source
1
En quoi est-ce différent de ssh remote-host "echo 'hello from remote-host' | pbcopy? Ce serait une excellente réponse si cela fonctionnait quelque chose comme ceci: ssh -X remote-hostalors sur l'hôte distant:echo 'hello from remote-host' | xclip -selection clipboard
kqw
5
@KasperSouren. Je pense que cela fonctionne comme vous l'espérez. Le `| xclip` est à l'intérieur des guillemets doubles.
gdw2
1
En 2016, c'est évidemment LA meilleure solution sans fioritures. Oubliez les autres solutions basées sur le reverse-ssh.
shivams
1
Existe-t-il un moyen de le faire sans que ce ne soit une commande ponctuelle? Je veux être connecté à mon serveur distant dans une session interactive via ssh et pouvoir ensuite envoyer arbitrairement à mon presse-papiers local. Cela nécessite-t-il un SSH inversé?
Kvass
2
@Kvass: Tant que vous utilisez -Xpour le transfert X11 sur SSH, les programmes X11 pourront mettre à jour votre presse-papiers via les paramètres XQuartz ci-dessus. La commande ponctuelle est de démontrer que l'envoi de quelque chose via echole presse-papiers de l'hôte distant via xclipfonctionne et doit se synchroniser avec votre hôte client SSH local. Notez comme @ gdw2 dit, "Le | xclipest entre les guillemets doubles". En tant que tel, il s'exécutera en tant que commande sur le serveur distant pour envoyer quelque chose dans son presse-papiers.
TrinitronX
18

Port de tunnel inversé sur le serveur ssh

Toutes les solutions existantes nécessitent soit:

  • X11 sur le client (si vous l'avez, xclipsur le serveur fonctionne très bien) ou
  • le client et le serveur doivent être dans le même réseau (ce qui n'est pas le cas si vous êtes au travail en essayant d'accéder à votre ordinateur personnel).

Voici une autre façon de le faire, même si vous devrez modifier la façon dont vous vous connectez à votre ordinateur.

J'ai commencé à l'utiliser et c'est loin d'être aussi intimidant que ça en a l'air, alors essayez-le.

Client (démarrage de session ssh)

ssh username@server.com -R 2000:localhost:2000

(indice: faites-en un raccourci clavier pour ne pas avoir à le taper)

Client (un autre onglet)

nc -l 2000 | pbcopy

Remarque: si vous ne l'avez pas, pbcopyil suffit de le teeplacer dans un fichier.

Serveur (dans la session SSH)

cat some_useful_content.txt | nc localhost 2000

Autres notes

En fait, même si vous êtes au milieu d'une session ssh, il existe un moyen de démarrer un tunnel, mais je ne veux pas effrayer les gens de ce qui n'est vraiment pas aussi mauvais qu'il y paraît. Mais j'ajouterai les détails plus tard si je vois un intérêt

Sridhar Sarnobat
la source
1
+1 - c'est plutôt chouette. Cependant - la cat some_useful_content.txt | nc localhost 2000commande semble se bloquer lorsque je fais cela. J'ai besoin de ctr-c manuellement pour l'arrêter, et ce n'est
Alan Storm
1
Il attendra que quelqu'un retire les données à l'autre extrémité.
Sridhar Sarnobat
En fait, je pense que j'ai mal compris votre question. Je ne sais pas pourquoi cela se produit.
Sridhar Sarnobat
nc -l -pfonctionne pour moi, mais ne nc -lfonctionne tout simplement pas. Et j'ai aussi le problème de @AlanStorm.
HappyFace
1
J'ai résolu le problème de la suspension de netcat en spécifiant -c. J'utilise GNU netcat installé par brew.
HappyFace
7

Il existe différents outils pour accéder aux sélections X11, y compris xclip et XSel . Notez que X11 a traditionnellement plusieurs sélections, et la plupart des programmes ont une certaine compréhension à la fois du presse-papiers et de la sélection principale (qui ne sont pas les mêmes). Emacs peut également travailler avec la sélection secondaire, mais c'est rare, et personne ne sait vraiment quoi faire avec les tampons coupés ...

$ xclip -help
Utilisation: xclip [OPTION] [FICHIER] ...
Accédez à une sélection de serveurs X pour la lecture ou l'écriture.

  -i, -in lit le texte dans la sélection X à partir d'une entrée standard ou de fichiers
                   (défaut)
  -o, -out imprime la sélection en sortie standard (généralement pour
                   piping vers un fichier ou un programme)
  -l, -loops nombre de demandes de sélection à attendre avant de quitter
  -d, -display X affichage auquel se connecter (par exemple localhost: 0 ")
  -h, -help informations d'utilisation
      -sélection de sélection pour accéder ("primaire", "secondaire", "presse-papiers" ou "buffer-cut")
      -noutf8 ne traite pas le texte comme utf-8, utilise l'ancien Unicode
      -informations sur la version de la version
      -silent erreurs uniquement, exécuté en arrière-plan (par défaut)
      - course silencieuse au premier plan, montre ce qui se passe
      -commentaire en cours d'exécution verbeux

Signalez les bogues à <[email protected]>
$ xsel -help
Utilisation: xsel [options]
Manipulez la sélection X.

Par défaut, la sélection actuelle est sortie et n'est pas modifiée si les deux
l'entrée standard et la sortie standard sont des bornes (ttys). Autrement,
la sélection de courant est sortie si la sortie standard n'est pas une borne
(tty), et la sélection est définie à partir de l'entrée standard si l'entrée standard
n'est pas un terminal (tty). Si des options d'entrée ou de sortie sont données, alors
le programme ne se comporte que dans le mode demandé.

Si l'entrée et la sortie sont requises, la sélection précédente est
sortie avant d'être remplacé par le contenu de l'entrée standard.

Options d'entrée
  -a, --append Ajoute l'entrée standard à la sélection
  -f, --follow Ajouter à la sélection à mesure que l'entrée standard augmente
  -i, --input Lire l'entrée standard dans la sélection

Options de sortie
  -o, --output Ecrit la sélection sur la sortie standard

Options d'action
  -c, --clear Effacer la sélection
  -d, --delete Demande que la sélection soit effacée et que
                        l'application qui en est propriétaire supprime son contenu

Options de sélection
  -p, --primary Agit sur la sélection PRIMAIRE (par défaut)
  -s, --secondary Opère sur la sélection SECONDARY
  -b, --clipboard Fonctionne sur la sélection CLIPBOARD

  -k, --keep Ne modifiez pas les sélections, mais faites le PRIMAIRE
                        et les sélections SECONDAIRES persistent même après
                        programmes qu'ils ont été sélectionnés en sortie.
  -x, --exchange Échange les sélections PRIMAIRE et SECONDAIRE

Options X
  --display displayname
                        Spécifiez la connexion au serveur X
  -t ms, --selectionTimeout ms
                        Spécifiez le délai en millisecondes pendant lequel le
                        la sélection doit être récupérée. Une valeur de 0 (zéro)
                        ne spécifie aucun délai (par défaut)

Options diverses
  -l, --logfile Spécifie le fichier dans lequel consigner les erreurs lorsqu'il est détaché.
  -n, --nodetach Ne se détache pas du terminal de contrôle. Sans pour autant
                        cette option, xsel va bifurquer pour devenir un arrière-plan
                        processus en mode entrée, échange et conservation.

  -h, --help Afficher cette aide et quitter
  -v, --verbose Affiche des messages informatifs
  --version Affiche les informations de version et quitte

Veuillez signaler les bogues à <[email protected]>.

En bref, vous devriez essayer xclip -i/ xclip -oou xclip -i -sel clip/ xclip -o -sel clipou xsel -i/ xsel -oou xsel -i -b/ xsel -o -b, selon ce que vous voulez.

éphémère
la source
4
Pour ajouter à @ephemient poste de »: Pour utiliser xclip & xsel avec un hôte distant, vous pouvez utiliser X11 Forwarding comme ceci: ssh -C -X user@remote-host. Si l'exécution de xclip du côté distant ne semble pas fonctionner, assurez-vous qu'il X11Forwarding yesest défini dans le /etc/ssh/sshd_configfichier distant . Assurez xauth- vous également qu'il est installé du côté distant. Pour une machine sans tête, vous pouvez installer xauthet xvfb.
TrinitronX
Voici une description avec des détails supplémentaires ainsi que les raccourcis clavier vim.
Tim Bunce
1
@TrinitronX oh wow - me cogner la tête contre un mur, merci pour la xvfbmention. J'utilisais un serveur headless, donc X11 ne devait pas fonctionner!
Cam du
5

C'est ma solution basée sur le tunnel inverse SSH, netcat et xclip.

Créez d'abord un script (par exemple, clipboard-daemon.sh) sur votre poste de travail:

#!/bin/bash
HOST=127.0.0.1
PORT=3333

NUM=`netstat -tlpn 2>/dev/null | grep -c " ${HOST}:${PORT} "`
if [ $NUM -gt 0 ]; then
    exit
fi

while [ true ]; do
    nc -l ${HOST} ${PORT} | xclip -selection clipboard
done

et démarrez-le en arrière-plan.

./clipboard-daemon.sh&

Il démarrera la sortie de la tuyauterie nc vers xclip et le processus de réapparition après avoir reçu une partie des données

Ensuite, démarrez la connexion ssh à l'hôte distant:

ssh user@host -R127.0.0.1:3333:127.0.0.1:3333

Lorsque vous êtes connecté sur la boîte à distance, essayez ceci:

echo "this is test" >/dev/tcp/127.0.0.1/3333

puis essayez de coller sur votre poste de travail

Vous pouvez bien sûr écrire un script wrapper qui démarre d'abord clipboard-daemon.sh puis ssh session. Voilà comment cela fonctionne pour moi. Prendre plaisir.

Krzysztof Księżyk
la source
Cette solution est celle qui a fonctionné le mieux pour moi. ce n'est pas trop compliqué et fonctionne correctement.
Marcel Valdez Orozco
Meilleure solution à mon avis. Vous n'avez pas à vous soucier d'autoriser la connexion ssh inversée, ce qui a des implications sur la sécurité, et la boucle infinie est une bonne idée.
R. Taukulis le
4

Pas une seule ligne, mais ne nécessite aucun ssh supplémentaire .

  • installer netcatsi nécessaire
  • utiliser termbin : cat ~/some_file.txt | nc termbin.com 9999. Cela copiera la sortie sur le termbinsite Web et imprimera l'URL sur votre sortie.
  • visitez cette URL depuis votre ordinateur, vous obtenez votre sortie

Bien entendu, ne l'utilisez pas pour du contenu sensible.

maxbellec
la source
Wow, c'est une solution très créative.
Sridhar Sarnobat
3

Cette réponse se développe à la fois sur la réponse choisie en ajoutant plus de sécurité.

Cette réponse a discuté de la forme générale

<command that makes output> | \
    ssh <user A>@<host A> <command that maps stdin to clipboard>

Lorsque la sécurité est peut manquer dans les sshautorisations permettant <user B>à host B>de sshdans host Aet d' exécuter une commande.

Bien sûr , Bd' Aaccès peut déjà être fermée par une sshclé, et il peut même avoir un mot de passe. Mais une autre couche de sécurité peut restreindre la portée des commandes autorisées sur lesquelles Bs'exécuter A, par exemple, rm -rf /ne peuvent pas être appelées. (Ceci est particulièrement important lorsque la sshclé n'a pas de mot de passe.)

Heureusement, ssha une fonctionnalité intégrée appelée restriction de commande ou commande forcée . Voir ssh.com ou cette question serverfault.com .

La solution ci-dessous montre la solution de formulaire générale avec la ssh restriction de commande appliquée.

Exemple de solution avec restriction de commande ajoutée

Cette solution de sécurité renforcée suit la forme générale - l'appel à partir de la sshsession host-Best simplement:

cat <file> | ssh <user-A>@<host A> to_clipboard

Le reste de ceci montre la configuration pour que cela fonctionne.

Configuration de la restriction de commande ssh

Supposons que le compte utilisateur sur Best user-B, et que B ait une clé ssh id-clip, qui a été créée de la manière habituelle ( ssh-keygen).

Ensuite, dans user-Ale répertoire ssh il y a un fichier

/home/user-A/.ssh/authorized_keys

qui reconnaît la clé id-clipet permet la sshconnexion.

Habituellement, le contenu de chaque ligne authorized_keysest exactement la clé publique autorisée, par exemple le contenu de id-clip.pub.

Cependant, pour appliquer la restriction de commande, le contenu de la clé publique est ajouté (sur la même ligne) par la commande à exécuter.
Dans notre cas:

command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>

La commande désignée "/home/user-A/.ssh/allowed-commands.sh id-clip", et seulement cette commande désignée, est exécutée chaque fois que la clé id-clipest utilisée pour lancer une sshconnexion à host-A- quelle que soit la commande écrite sur la sshligne de commande .

La commande indique un fichier de script allowed-commands.shet le contenu de ce fichier de script est

#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

Id=${1}

case "$SSH_ORIGINAL_COMMAND" in
    "to-clipboard")
          notify-send "ssh to-clipboard, from ${Id}"
        cat | xsel --display :0 -i -b
          ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

L'appel initial sshsur la machine Bétait

... | ssh <user-A>@<host A> to_clipboard

La chaîne to-clipboardest transmise allowed-commands.shpar la variable d'environnement SSH_ORIGINAL_COMMAND. Ajout, nous avons passé le nom de la clé,, à id-clippartir de la ligne dans authorized_keyslaquelle on accède uniquement par id-clip.

La ligne

          notify-send "ssh to-clipboard, from ${Id}"

est juste une boîte de message contextuelle pour vous informer que le presse-papiers est en cours d'écriture - c'est probablement aussi une bonne fonctionnalité de sécurité. ( notify-sendfonctionne sur Ubuntu 18.04, peut-être pas sur d'autres).

Dans la ligne

cat | xsel --display :0 -i -b

le paramètre --display :0est nécessaire car le processus n'a pas son propre affichage X avec un presse-papiers, il doit donc être spécifié explicitement. Cette valeur :0fonctionne sur Ubuntu 18.04 avec le serveur de fenêtres Wayland. Sur d'autres configurations, cela peut ne pas fonctionner. Pour un serveur X standard, cette réponse peut aider.

host-A /etc/ssh/sshd_config paramètres

Enfin, quelques paramètres dans /etc/ssh/sshd_configsur l'hôte Aqui devraient être définis pour garantir l'autorisation de se connecter et l'autorisation d'utiliser ssh-key uniquement sans mot de passe:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

Pour que le sshdserveur relise la configuration

sudo systemctl restart sshd.service

ou

sudo service sshd.service restart

conclusion

C'est un peu d'effort pour le configurer, mais d'autres fonctions to-clipboardpeuvent être construites en parallèle dans le même cadre.

Craig Hicks
la source
1
Le Xsel avec transfert à distance était la seule réponse qui fonctionnait pour moi sur Ubuntu 18.04 exécutant i3 localement. Aucun transfert X11 nécessaire.
Jay Stanley
2

La solution la plus simple de toutes, si vous êtes sur OS X en utilisant Terminal et que vous avez ssh'ing sur un serveur distant et que vous souhaitez récupérer les résultats d'un fichier texte ou d'un journal ou d'un csv, simplement:

1) Cmd-Kpour effacer la sortie du terminal

2) cat <filename>pour afficher le contenu du fichier

3) Cmd-Spour enregistrer la sortie du terminal

Vous devrez supprimer manuellement la première ligne et la dernière ligne du fichier, mais cette méthode est un peu plus simple que de compter sur d'autres packages à installer, des "tunnels inversés" et d'essayer d'avoir une adresse IP statique, etc.

tw0000
la source
+1 pour une technique utile que j'ai moi-même utilisée, mais cela vous oblige à perdre l'historique de votre terminal et (comme mentionné) le problème de la première / dernière ligne est un peu compliqué.
Alan Storm
Convenu @AlanStorm
tw0000
Le problème le plus important avec cette approche est qu'elle ne sauvera que le nombre de lignes que votre tampon de terminal conserve. Souvent, ce n'est pas un problème, mais si vous essayez de récupérer le contenu d'un fichier journal, vous risquez de manquer de capacité,
Sridhar Sarnobat
C'est vrai @ Sridhar-Sarnobat, ce n'est pas une très bonne solution en général. J'utilise juste scp!
tw0000