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,
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.
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
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écutezssh -p 2222 127.0.0.1
Sur la machine distante, qui redirigera ensuite la connexion vers la machine locale. - nbren12
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:
,
)ssh -X remote-Host "echo 'hello from remote-Host' | xclip -selection clipboard"
Toutes les solutions existantes nécessitent soit:
xclip
sur le serveur fonctionne très bien) ouVoici 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.
ssh [email protected] -R 2000:localhost:2000
(Indice: faites-en un raccourci clavier pour ne pas avoir à le taper)
nc -l 2000 | pbcopy
Remarque: si vous n'avez pas pbcopy
, alors simplement tee
dans un fichier.
cat some_useful_content.txt | nc localhost 2000
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
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.
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.
Pas un one-liner, mais ne nécessite aucun ssh supplémentaire .
netcat
si nécessairecat ~/some_file.txt | nc termbin.com 9999
. Cela copiera la sortie sur le site Web termbin
et imprimera l'URL sur votre sortie.Bien sûr, ne l'utilisez pas pour du contenu sensible.
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.
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.
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.
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
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.
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/
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.