11 votos

¿Cómo puedo copiar a la OSX portapapeles desde un shell remoto utilizando iTerm2?

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.

6voto

aye Puntos 36

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

Enlaces De Referencia

0voto

Michael Zhou Puntos 167

Usted puede hacer esto

ssh -ttt user@location "ksh -c 'ls *'" | pbcopy

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X