web-dev-qa-db-fra.com

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

Question Borderline ServerFault, mais je suis programmation quelques scripts Shell, donc j'essaye ici en premier :)

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

pbcopy, pbpaste 

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

  1. J'utilise l'ordinateur A.
  2. J'ouvre une fenêtre de terminal
  3. Je SSH à l'ordinateur B
  4. Je lance 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 (frémir) utiliser ma souris pour sélectionner le texte de la commande, mais je me suis tellement habitué au flux de travail consistant à afficher la sortie directement dans le Presse-papiers que je souhaite la même chose pour mes sessions distantes.

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

128
Alan Storm

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 de OSX Daily .

Dans mon cas, j'utilise Terminal sur ma machine OSX locale pour me connecter à un serveur Linux via SSH. À l'instar de l'OP, je souhaitais pouvoir transférer de petits morceaux de texte d'un terminal à mon presse-papiers local, uniquement à l'aide du clavier.

L'essence de la solution:

commandThatMakesOutput | ssh desktop pbcopy

Lorsqu'elle est exécutée dans une session ssh sur un ordinateur distant, cette commande prend la sortie de commandThatMakesOutput (par exemple, ls, pwd) et dirige la sortie vers le presse-papier 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 à cet emplacement et l'ordinateur distant se connecte à votre bureau via une session ssh différente et place le texte dans votre presse-papiers.

Cela nécessite que votre bureau soit configuré en tant que serveur SSH (que je vous laisse ainsi que Google). C'est beaucoup plus facile si vous avez configuré des clés ssh pour faciliter une utilisation rapide de ssh, de préférence en utilisant un mot de passe par session ou par tout autre besoin de sécurité.

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 enregistré avec le nom du fichier cb (mon mnémonique (ClipBoard). Mettez le script quelque part dans votre chemin, rendez-le exécutable et le tour est joué:

ls | cb
70
rhileighalmgren

Mon moyen préféré 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 en local.

Éditer: 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 à l'aide du transfert de port SSH. Ajoutez simplement RemoteForward 127.0.0.1:2222 127.0.0.1:22 À l'entrée du serveur dans votre .ssh/config Local, puis exécutez ssh -p 2222 127.0.0.1 Sur la machine distante, qui redirigera ensuite la connexion vers la machine locale. - nbren12

97

Vous avez trouvé une excellente solution ne nécessitant pas de connexion SSH inversée!

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

Pour le configurer:

  1. Installez XQuartz (je l'ai fait avec soliste + pivotal_workstation :: xquartz , mais vous n'êtes pas obligé de le faire)
  2. Exécuter XQuartz.app
  3. Ouvrez les préférences XQuartz (kb_command+ ,)
  4. Assurez-vous que "Activer la synchronisation" et "Mettre à jour le carton collé lorsque CLIPBOARD change" sont vérifiés XQuartz Preferences window example
  5. ssh -X remote-Host "echo 'hello from remote-Host' | xclip -selection clipboard"
28
TrinitronX

Inverser le port de tunnel sur le serveur ssh

Toutes les solutions existantes nécessitent soit:

  • X11 sur le client (si vous en avez, xclip sur le serveur fonctionne très bien) ou
  • le client et le serveur doivent se trouver sur le même réseau (ce qui n'est pas le cas si vous êtes au travail et essayez d'accéder à votre ordinateur à la maison).

Voici une autre façon de le faire, bien que vous ayez besoin de modifier la manière dont vous utilisez SSH sur votre ordinateur.

J'ai commencé à l'utiliser et il est loin d'être aussi intimidant qu'il y paraît, alors essayez-le.

Client (démarrage de session ssh)

ssh [email protected] -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 n'avez pas pbcopy, alors simplement tee 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 créer un tunnel, mais je ne veux pas effrayer les gens de ce qui n’est pas aussi grave qu’il en a l’air. Mais j'ajouterai les détails plus tard si je vois un intérêt

9
Sridhar Sarnobat

Il existe différents outils pour accéder aux sélections X11, notamment xclip et XSel . Notez que X11 a traditionnellement plusieurs sélections et que la plupart des programmes comprennent un peu le presse-papiers et la sélection principale (qui ne sont pas identiques). Emacs peut aussi fonctionner avec la sélection secondaire, mais c'est rare, et personne ne sait vraiment quoi faire avec les tampons de coupe ...

 $ xclip -help 
 Utilisation: xclip [OPTION] [FILE] ... 
 Accéder à une sélection de serveur 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 
 (valeur par défaut) 
 -o, -out imprime la sélection sur une sortie standard (généralement pour 
 un fichier ou un programme) 
 -l, -loops le nombre de demandes de sélection à attendre avant de quitter 
 -d, -display X afficher à se connecter (par exemple localhost: 0 ") 
 -h, -help informations d’utilisation 
 - sélection de la sélection à accéder ("primaire", "secondaire", "presse-papiers" ou "coupure de tampon") 
 -noutf8 ne traite pas le texte comme utf-8, utilise les anciennes informations de version unicode 
 -version 
 -silent uniquement, exécuté en arrière-plan (par défaut) 
 - commentaire courant 
 
 Signaler les bogues à <a [email protected]> 
 $ xsel -help 
 Utilisation: xsel [options] 
 Manipuler la sélection X. 
 
 Par défaut, la sélection actuelle est affichée et non modifiée. si 
 l’entrée standard et la sortie standard sont des bornes (ttys). Sinon, 
 La sélection actuelle 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 une borne (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 une entrée et une sortie sont nécessaires, la sélection précédente est [.____]. sortie avant d’être remplacée par le contenu de l’entrée standard. 
 
 Options d’entrée 
 -a, --append Ajouter une entrée standard à la sélection 
 -f, - follow Ajouter à la sélection lorsque l’entrée standard augmente 
 -i, --input Lire l’entrée standard dans la sélection 
 
 Options de sortie 
 -o, --putput Écrire le sélection vers la sortie standard 
 
 Options d'action 
 -c, --clear Effacer la sélection 
 -d, --delete Demander 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 Utiliser la sélection PRIMAIRE (par défaut) 
 -s, --secondaire opérer sur le SECONDAIRE se lection 
 -b, --clipboard Utiliser la sélection CLIPBOARD 
 
 -k, --keep Ne modifiez pas les sélections, mais définissez les options PRIMARY 
 et SECONDARY. les sélections persistent même après que les programmes 
 ont été sélectionnés en sortie. 
 -x, --exchange Exchange les sélections PRIMAIRE et SECONDAIRE 
 
 X options 
 --display displayname 
 Spécifiez la connexion au serveur X 
 -t ms, --selectionTimeout ms 
 Spécifiez le délai d'expiration en millisecondes pendant lequel la sélection 
 doit être récupéré. Une valeur de 0 (zéro) 
 Ne spécifie aucun délai d'attente (par défaut) 
 
 Options diverses 
 -L, --logfile Spécifiez le fichier dans lequel enregistrer les erreurs lors de la séparation. 
 -n, --nodetach Ne pas détacher du terminal de contrôle. Sans 
 Cette option, xsel deviendra un processus d'arrière-plan 
 En mode d'entrée, d'échange et de conservation. 
 
 -H, --help Affiche cette aide et exit 
 -v, --verbose Imprimer des messages informatifs 
 --version Affiche les informations sur la version et exit 
 
. Veuillez signaler les bogues à <[email protected]>. 

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

7
ephemient

Ceci est ma solution basée sur SSH Reverse Tunnel, Netcat et xclip.

Commencez par créer 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 commencez en arrière-plan.

./clipboard-daemon.sh&

Il lancera la sortie nc piping vers xclip et le processus de réapparition après réception d’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

Pendant que vous êtes connecté à distance, essayez ceci:

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

puis essayez coller sur votre poste de travail

Vous pouvez bien sûr écrire un script wrapper qui lance clipboard-daemon.sh en premier, puis une session ssh. C'est comme ça que ça marche pour moi. Prendre plaisir.

4

Pas un one-liner, mais ne nécessite aucun ssh supplémentaire .

  • installer netcat si nécessaire
  • use termbin : cat ~/some_file.txt | nc termbin.com 9999. Cela copiera la sortie sur le site Web termbin et imprimera l'URL sur votre sortie.
  • visitez cette URL à partir de votre ordinateur, vous obtenez votre sortie

Bien sûr, ne l'utilisez pas pour du contenu sensible.

3
maxbellec

Cette réponse se développe à la fois sur le 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>

Là où la sécurité peut faire défaut, c’est dans les autorisations ssh permettant à <user B> Sur Host B> De ssh dans Host A Et d’exécuter toute commande.

Bien sûr, l'accès de B à A peut déjà être bloqué par une touche ssh, 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 que B peut exécuter sur A, par exemple. de sorte que rm -rf / ne puisse pas être appelé. (Ceci est particulièrement important lorsque la touche ssh pas a un mot de passe.)

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

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

Exemple de solution avec commande restriction ajoutée

Cette solution optimisée pour la sécurité suit le formulaire général - l'appel de la session ssh sur Host-B Est simplement:

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

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

Configuration de restriction de commande ssh

Supposons que le compte utilisateur sur B soit user-B Et que B possède une clé ssh id-clip, Créée de la manière habituelle (ssh-keygen).

Ensuite, dans le répertoire ssh de user-A, Il y a un fichier

/home/user-A/.ssh/authorized_keys

qui reconnaît la clé id-clip et permet la connexion ssh.

Généralement, le contenu de chaque ligne authorized_keys Correspond 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-clip Est utilisée pour établir une connexion ssh avec Host-A - quelle que soit la commande écrite en ligne de commande ssh.

La commande indique un fichier de script allowed-commands.sh, Et 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 à ssh sur la machine B était

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

La chaîne to-clipboard Est transmise à allowed-commands.sh Par la variable d'environnement SSH_ORIGINAL_COMMAND. En outre, nous avons passé le nom de la clé, id-clip, À partir de la ligne de authorized_keys, Accessible 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 une bonne fonctionnalité de sécurité aussi. (notify-send Fonctionne sur Ubuntu 18.04, peut-être pas sur d'autres).

Dans la ligne

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

le paramètre --display :0 est 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 :0 Se trouve sur Ubuntu 18.04 avec le serveur de fenêtres Wayland. Sur d'autres configurations, cela pourrait ne pas fonctionner. Pour un serveur X standard cette réponse pourrait vous aider.

Paramètres Host-A/etc/ssh/sshd_config

Enfin, quelques paramètres dans /etc/ssh/sshd_config Sur l'hôte A doivent être définis pour garantir l'autorisation de connexion et l'autorisation d'utiliser ssh - clé uniquement sans mot de passe:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

Pour que le serveur sshd relise la configuration

Sudo systemctl restart sshd.service

ou

Sudo service sshd.service restart

conclusion

C'est un peu difficile de le configurer, mais d'autres fonctions que to-clipboard Peuvent être construites en parallèle dans le même cadre.

3
Craig Hicks

La solution @rhileighalmgren est bonne, mais pbcopy copiera ennuyeusement le dernier caractère "\ n". J'utilise "head" pour supprimer le dernier caractère afin d'éviter cela:

#!/bin/bash
head -c -1 |  ssh desktop pbcopy

Ma solution complète est ici: http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/

1
Taylor Hawkes

La solution la plus simple de toutes, si vous utilisez OS X sous Terminal et que vous avez déjà utilisé un serveur distant et que vous souhaitez récupérer les résultats d'un fichier texte, d'un journal ou d'un csv, simplement:

1) Cmd-K pour effacer la sortie du terminal

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

3) Cmd-S pour sauvegarder la sortie du terminal

Vous aurez la possibilité de supprimer manuellement la première ligne et la dernière ligne du fichier, mais cette méthode est un peu plus simple que de s’appuyer sur d’autres paquetages à installer, des "tunnels inversés" et sur l’essai d’une adresse IP statique, etc.

1
tw0000