El uso de iTerm2, me inicio interactivo de sesión SSH a un equipo Linux remoto (donde pbcopy
no está disponible). En el control remoto de la máquina Linux me gustaría capturar la salida de algunos comandos arbitrarios (por ejemplo, ls *.foo
), y tienen que aparecer mágicamente en mi OSX portapapeles, por lo que cuando llegué a la ⌘+v aparece en cualquier OSX aplicación que acabas de pegar. Es esto posible? He intentado escapar de los códigos mencionados en el iTerm2 doc página y no puedo hacer que funcionen.
Respuestas
¿Demasiados anuncios?Solución
Juntando un montón de información de diversas fuentes, esto es lo que se me ocurrió.
Demonio Local
Desde el equipo local (OSX), la configuración de un demonio para que escuche en un puerto específico, a través de la launchd
(ver enlaces más abajo). El demonio simplemente llame a pbcopy
, el cual tendrá nada se pasa a través de STDIN
y ponerlo en el portapapeles. Para hacer esto usted necesita para la instalación de un launchd
archivo plist. La mía se veía así:
<?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>
Por convención, el plist nombre del archivo debe ser el nombre de la etiqueta con .plist
anexa, por lo que para el ejemplo anterior, sería local.pbcopy.9999.plist
. Si desea utilizar un puerto distinto 9999, se cambie por todas partes (teniendo en cuenta que debe ser algo por encima de 1024 y no debe ser un puerto conocido que es posible que ya esté utilizando). Una vez que las cosas de trabajo, usted puede quitar el StandardOutPath
y StandardErrorPath
llaves y cadenas de caracteres, ya que sólo son necesarios para la depuración.
Para cargar el demonio, ejecute el siguiente comando:
$ launchctl load local.pbcopy.9999.plist
Usted puede ver que es cargado o quitar con los siguientes comandos:
$ launchctl list local.pbcopy.9999
$ launchctl remove local.pbcopy.9999
Si le gusta esta carga en cada inicio de sesión, coloque el archivo plist en la ~/Library/LaunchAgents
directorio.
Nota: usted tendrá que configurar esto en cada host local quiere que esto funcione.
SSH Port-Forwarding
Porque yo podría acceder a la máquina remota de varios equipos locales, no puedo codificar el envío de los datos en la máquina remota a un host específico. Para hacer esto lo más fácil y dinámico posible, he usado SSH port-forwarding para crear un vínculo dinámico de la máquina remota a la computadora local (el cómo y el por qué de esto están más allá de esta respuesta; ver más abajo para más información). Específicamente, puedo crear un enlace desde el control remoto de las máquinas del puerto 9997 para el equipo local del puerto 9999, que ahora tiene un demonio a la escucha, gracias a la launchd
cosas de arriba. Yo podría usar el puerto 9999 en el remoto de la máquina y el equipo local, pero no necesito.
Para la instalación de este túnel, ejecute el siguiente comando:
$ ssh -R 9997:localhost:9999 user@remote.com
Usted puede conectarse de forma remota a varios equipos remotos con el mismo comando y todo funcionará como se esperaba. Usted puede remota en el mismo equipo remoto varias veces con el mismo comando, y se clasificará de funcionar como se esperaba; véase la nota a continuación.
El Envío De Datos
En el extremo remoto utilizo netcat
a enviar el contenido deseado volver a escuchar el demonio.
$ date | nc localhost 9997
Usted puede conseguir tan complicado como quieras:
$ nc localhost 9997 <<EOF
> `ls -ld *`
> `date`
> EOF
Usted puede incluso dinámicamente decidir si enviar o no los datos, en función de si o no alguien está escuchando (probablemente hay una manera más eficiente de hacer esto, pero funciona):
#!/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
Observaciones Y Advertencias
Cosas que he notado:
-
pbcopy
juega muy bien con Copiar Pegar em - si se inicia más de una sesión SSH con el mismo mando a distancia del puerto de reenvío a la misma máquina remota, sólo el primero tiene ningún efecto; no "duplicar puerto" tipo de errores se informó sobre cualquiera de los extremos
- del mismo modo, si el control remoto en la de varios equipos locales a la misma máquina remota usando el mismo puerto remoto (por ejemplo, 9997), sólo el primero tiene ningún efecto