Solution
Rassemblant de nombreuses informations provenant de plusieurs sources différentes, voici ce que j'ai proposé.
Démon local
À partir de l'ordinateur local (OSX), configurez un démon pour qu'il écoute sur un port spécifique, via launchd
(voir les liens ci-dessous). Le processus démon appellera simplement pbcopy
, ce qui prendra tout ce qui est passé dans STDIN
et le mettra dans le presse-papiers. Pour ce faire, vous devez configurer un launchd
fichier plist. Le mien ressemblait à ceci:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.pbcopy.9999</string>
<key>UserName</key>
<string>joe</string>
<key>Program</key>
<string>/usr/bin/pbcopy</string>
<key>StandardOutPath</key>
<string>/tmp/pb9999.out</string>
<key>StandardErrorPath</key>
<string>/tmp/pb9999.err</string>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockNodeName</key>
<string>localhost</string>
<key>SockServiceName</key>
<string>9999</string>
</dict>
</dict>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
</dict>
</plist>
Par convention, le nom du fichier plist devrait être le nom de l'étiquette avec le nom .plist
ajouté, donc pour l'exemple ci-dessus, ce le serait local.pbcopy.9999.plist
. Si vous souhaitez utiliser un port autre que 9999, il suffit de le changer partout (en gardant à l'esprit qu'il doit être supérieur à 1024 et ne pas être un port bien connu que vous utilisez peut-être déjà). Une fois que vous avez des choses à travailler, vous pouvez supprimer les StandardOutPath
et les StandardErrorPath
clés et les chaînes, car ils sont seulement nécessaires pour le débogage.
Pour charger le démon, exécutez la commande suivante:
$ launchctl load local.pbcopy.9999.plist
Vous pouvez voir qu'il est chargé ou le supprimer à l'aide des 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 ~/Library/LaunchAgents
répertoire.
Remarque: vous devrez configurer ceci sur chaque hôte local sur lequel vous souhaitez que cela fonctionne.
SSH Port-Forwarding
Étant donné que je pourrais accéder à la machine distante à partir de plusieurs ordinateurs locaux différents, je ne peux pas coder 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 entre la machine distante et l'ordinateur local (le comment et le pourquoi de ceci sont au-delà de cette réponse; voir ci-dessous pour plus d'informations) . Plus précisément, je crée un lien entre le port 9997 de la machine distante et le port 9999 de l'ordinateur local, sur lequel un démon écoute, grâce aux launchd
éléments ci-dessus. Je pourrais utiliser le port 9999 sur la machine distante et sur l'ordinateur local, mais ce n'est pas nécessaire.
Pour configurer ce tunnel, exécutez la commande suivante:
$ ssh -R 9997:localhost:9999 user@remote.com
Vous pouvez effectuer la commande à distance sur plusieurs machines distantes différentes avec la même commande et tout fonctionnera comme prévu. Vous pouvez effectuer plusieurs fois la télécommande sur le même ordinateur distant avec la même commande et cela fonctionnera comme prévu. voir note ci-dessous.
Si vous ne souhaitez pas saisir le caractère -R 9997:localhost:9999
à chaque appel SSH, vous pouvez insérer la définition de transfert à distance dans le fichier de configuration SSH pour le faire automatiquement. Voici un exemple de mon ~/.ssh/config
dossier:
Host ufo*
RemoteForward 9997 localhost:9999
Avec cela, chaque fois que je SSH à un hôte dont le nom commence par 'ufo', la transmission à distance de 9997 à localhost: 9999 sera automatiquement configurée. Voir le lien de la page de manuel du fichier de configuration ci-dessous pour plus d'options.
Envoi de données
Sur le netcat
serveur distant, je renvoie le contenu souhaité au démon d’écoute.
$ date | nc localhost 9997
Vous pouvez devenir aussi compliqué que vous le souhaitez:
$ nc localhost 9997 <<EOF
> `ls -ld *`
> `date`
> EOF
Vous pouvez même décider de manière dynamique d'envoyer ou non des données, en fonction du fait que quelqu'un écoute ou non (il existe probablement un moyen plus efficace de le faire, 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 et mises en garde
Choses que j'ai notées:
pbcopy
joue bien avec Copy'em Paste
- Si vous lancez plusieurs sessions SSH avec le même transfert de port distant sur le même ordinateur distant, seul le premier aura un effet quelconque. aucune erreur de type "port dupliqué" ne sera signalée à l'une ou l'autre extrémité
- De même, si vous utilisez plusieurs ordinateurs locaux différents pour la même machine distante à l'aide du même port distant (par exemple, 9997), seul le premier aura un effet.
Liens de référence