3 votos

Cargando User LaunchAgent con éxito

He creado un archivo plist para reemplazar un xinetd proceso que he utilizado con éxito en Windows (Cygwin) y Linux para transmitir un imapd conexión desde un servidor remoto a través de ssh en un puerto del localhost.

El plutil dice que mi configuración está bien. launchctl load path-to-plist se ejecuta sin errores.

Cuando corro launchctl list el agente no se muestra. Cuando intento conectarme al puerto en el localhost, obtengo conexión rechazada.

Aquí está mi archivo plist:

<?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>com.my.ssh_tunnel</string>
        <key>Program</key>
            <string>/usr/bin/ssh</string>
        <key>ProgramArguments</key>
            <array>
                    <string>-F /Users/userx/.ssh/config</string>
                    <string>dname /usr/sbin/imapd</string>
            </array>
        <key>Sockets</key>
            <dict>
                <key>Listeners</key>
                <dict>
                    <key>SockServiceName</key>
                        <string>dname-imapd</string>
                    <key>SockType</key>
                        <string>stream</string>
                    <key>SockProtocol</key>
                        <string>TCP</string>
                </dict>
            </dict>
        <key>inetdCompatibility</key>
            <dict>
                <key>Disabled</key>
                <false/>
                <key>Wait</key>
                <false/>
            </dict>
        <key>EnvironmentVariables</key>
            <dict>
                <key>SSH_AUTH_SOCK</key>
                    <string>/Users/userx/.ssh-agent.sock</string>
            </dict>
    </dict>
</plist>

He añadido una línea a /etc/servicios para dname-imapd y un puerto no asignado (49022). En última instancia, voy a utilizar esto junto con ssh-agent (para hacer que esto funcione 'sin contraseña') y Thunderbird para recuperar el correo de un sistema muy bloqueado.

Aquí hay esencialmente dos cuestiones. Una, ¿cómo sé que mi agente se está cargando (y cómo lo confirmo)? Dos, ¿es mi plist realmente correcto?

Aquí está mi original xinetd configurar:

service imapssh
{
        disable         = no
        type            = UNLISTED
        port            = 2208
        socket_type     = stream
        protocol        = tcp
        wait            = no
        server          = /usr/bin/ssh
        server_args     = dname /usr/sbin/imapd
        user            = userx
}

Gracias por cualquier ayuda. Esto me está volviendo un poco loco.

Esto es en un Macbook Pro El Capitan.

Además, he probado con un túnel ssh directo pero no funciona realmente (antes de que alguien lo sugiera). A menos que alguien sepa cómo hacer que funcione como inetd y se genera cada vez que el cliente de correo se conecta al puerto.

1voto

John N Puntos 400

Bien, abordando primero su segunda pregunta ( ¿es mi plist realmente correcto? ), plutil (en su invocación por defecto) "lints" (controles) plist archivos para comprobar que son correctos:

plutil ~/Library/LaunchAgents/local.brew.update.plist

Equivalente a:

plutil -lint ~/Library/LaunchAgents/local.brew.update.plist

En cuanto a su primera pregunta ( ¿Cómo sé que mi agente se está cargando (y cómo lo confirmo)? ), aquí hay algunas cosas que ayudan a comprobarlo.

En primer lugar, recomendaría añadir un registro para ayudar a la depuración. Yo registro en ~/Library/Logs Así que añade algo como esto a mi plist :

<key>StandardOutPath</key>
<string>/Users/userx/Library/Logs/local.brew.update.stdout</string>
<key>StandardErrorPath</key>
<string>/Users/userx/Library/Logs/local.brew.update.stderr</string>

Intente recargar su plist y luego revisa tus registros:

less ~/Library/Logs/local.brew.update.stdout
less ~/Library/Logs/local.brew.update.stderr

Algunas observaciones adicionales:

Mi comprensión de su inetdCompatibility es que el agente se inicie cuando se cargue. Sin embargo, usted dice que launchctl list no muestra al agente. ¿Cambia esto si se intenta launchctl start com.my.ssh_tunnel después de cargar el plist ? ¿Los registros muestran algo nuevo?

No entiendo del todo la relación entre Program y ProgramArguments - podría ser sólo yo, pero encuentro man launchd.plist La explicación de ProgramArguments difícil de llevar. Me inclinaría a intentar añadir /usr/bin/ssh como primera string en ProgramArguments y eliminando la entrada de Program . (A continuación, vuelva a cargar y compruebe los registros. Vuelva a arrancar y compruebe los registros si es necesario).

Por último, estoy bastante seguro de que @daniel-Azuelos está en lo cierto, y es necesario especificar su ProgramArguments así (he añadido usr/bin/ssh como se ha mencionado anteriormente):

<key>ProgramArguments</key>
<array>
    <string>/usr/bin/ssh</string>
    <string>-F</string>
    <string>/Users/userx/.ssh/config</string>
    <string>dname</string>
    <string>/usr/sbin/imapd</string>
</array>

Mi razonamiento para esto es que los pocos plist s que puedo encontrar en mi sistema que utilizan (más de uno) ProgramArguments utilizar esta expresión:

<key>Label</key>
<string>com.divx.uninstall.preferences</string>
<key>ProgramArguments</key>
<array>
    <string>/bin/bash</string>
    <string>-c</string>
    <string>if [[ ! -e "/Applications/DivX/DivX Preferences.app" ]] ; then open "/Library/Application Support/DivX/Uninstall DivX for Mac.app"; fi</string>
</array>

Observe cómo bash 's -c y la correspondiente opción command_string están en argumentos separados.

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