Solution
En rassemblant de nombreuses informations provenant de différentes sources, voici ce que j'ai trouvé.
Démon Local
Depuis l'ordinateur local (OSX), configurez un démon pour écouter sur un port spécifique, via launchd
(voir les liens ci-dessous). Le processus du démon appellera simplement pbcopy
, qui prendra tout ce qui est passé via STDIN
et le mettra dans le presse-papiers. Pour ce faire, vous devez configurer un fichier plist launchd
. Le mien ressemblait à ceci :
Label
local.pbcopy.9999
UserName
joe
Program
/usr/bin/pbcopy
StandardOutPath
/tmp/pb9999.out
StandardErrorPath
/tmp/pb9999.err
Sockets
Listeners
SockNodeName
localhost
SockServiceName
9999
inetdCompatibility
Wait
Par convention, le nom du fichier plist devrait être le nom de l'étiquette avec .plist
ajouté, donc pour l'exemple ci-dessus, ce serait local.pbcopy.9999.plist
. Si vous souhaitez utiliser un port autre que 9999, changez-le partout (en gardant à l'esprit qu'il doit être quelque chose au-dessus de 1024 et ne doit pas être un port connu que vous pourriez déjà utiliser). Une fois que tout fonctionne, vous pouvez supprimer les clés et les chaînes StandardOutPath
et StandardErrorPath
, car elles ne sont nécessaires que pour le débogage.
Pour charger le démon, exécutez la commande suivante :
$ launchctl load local.pbcopy.9999.plist
Vous pouvez voir s'il est chargé ou le retirer avec les commandes suivantes :
$ launchctl list local.pbcopy.9999
$ launchctl remove local.pbcopy.9999
Si vous souhaitez que cela se charge à chaque fois que vous vous connectez, placez le fichier plist dans le répertoire ~/Library/LaunchAgents
.
Remarque : vous devrez configurer ceci sur chaque hôte local sur lequel vous voulez que cela fonctionne.
Transfert de Port SSH
Comme je pourrais accéder à la machine distante depuis plusieurs ordinateurs locaux différents, je ne peux pas indiquer en dur l'envoi des données sur la machine distante à un hôte spécifique. Pour rendre cela aussi indolore et dynamique que possible, j'ai utilisé le transfert de port SSH pour créer un lien dynamique de la machine distante vers l'ordinateur local (les comment et pourquoi sont au-delà de cette réponse ; voir ci-dessous pour plus d'informations). Spécifiquement, je crée un lien du port 9997 de la machine distante au port 9999 de l'ordinateur local, qui a maintenant un démon qui écoute, grâce aux éléments launchd
ci-dessus. Je pourrais utiliser le port 9999 à la fois sur la machine distante et sur l'ordinateur local, mais je n'en ai pas besoin.
Pour configurer ce tunnel, exécutez la commande suivante :
$ ssh -R 9997:localhost:9999 utilisateur@remote.com
Vous pouvez vous connecter à plusieurs machines distantes différentes avec la même commande et tout fonctionnera comme prévu. Vous pouvez vous connecter plusieurs fois à la même machine distante avec la même commande, et cela fonctionnera plus ou moins comme prévu ; voir la note ci-dessous.
Si vous ne voulez pas taper -R 9997:localhost:9999
à chaque invocation SSH, vous pouvez mettre la définition de transfert distant dans le fichier de configuration SSH pour le faire automatiquement. Voici un exemple de mon fichier ~/.ssh/config
:
Host ufo*
RemoteForward 9997 localhost:9999
Avec cela, à chaque fois que je me connecte en SSH à un hôte dont le nom commence par 'ufo', le transfert distant de 9997 à localhost:9999 sera automatiquement configuré. Consultez le lien de la page de manuel du fichier de configuration pour plus d'options.
Envoi de Données
À l'extrémité distante, j'utilise netcat
pour envoyer le contenu souhaité au démon en écoute.
$ date | nc localhost 9997
Vous pouvez rendre les choses aussi compliquées que vous le souhaitez :
$ nc localhost 9997 < `ls -ld *`
> `date`
> EOF
Vous pouvez même décider dynamiquement d'envoyer ou non des données, en fonction de la présence ou non d'une écoute (il y a probablement une manière plus efficace de faire cela, mais cela fonctionne) :
#!/bin/bash
cnt=`(netstat -lnptu 2>/dev/null) | grep 127.0.0.1:9999 | grep -v grep | wc -l`
if [[ $cnt -eq 1 ]]; then
date | nc localhost 9999
fi
Observations & Avis
Choses que j'ai notées :
pbcopy
fonctionne bien avec Copy'em Paste
- si vous lancez plus d'une session SSH avec le même transfert de port distant vers la même machine distante, seule la première aura un effet ; aucune erreur de "port en double" ne sera signalée d'un côté ou de l'autre
- de même, si vous vous connectez depuis plusieurs ordinateurs locaux différents à la même machine distante en utilisant le même port distant (par ex. 9997), seule la première aura un effet
Liens de Référence
0 votes
stackoverflow.com/questions/1152362/…
0 votes
@klanomath -- merci, je vais prendre ça en considération (je ne suis pas sûr de vouloir configurer un accès à nouveau à ma machine via des clés SSH, même si cela pourrait être protégé par un code secret, bien sûr.)
0 votes
Il nécessite X sur le serveur distant, qui n'est pas là, et XQuartz qui tourne sur le serveur local, ce qui fait chauffe ma machine. Mais c'est peut-être ma meilleure option -- merci !
0 votes
Puis le commentaire de nbren12 à la deuxième réponse! ;-)
0 votes
J'ai déjà regardé cela - cela nécessite toujours que les clés SSH soient configurées, et c'est la seule manière dont je pourrais le faire, puisqu'un cas d'utilisation suppose que je me connecte en SSH à la machine distante à partir d'une connexion VPN, donc pas d'IP statique ou de nom d'hôte. Un autre problème est que j'ai des noms de compte utilisateur différents sur mes deux machines locales principales, mais je pourrais résoudre cela dans une variable d'environnement ou quelque chose. Merci pour vos efforts, cependant, je l'apprécie vraiment.