Cargando el agente de inicio de usuario con éxito

4

He creado un archivo plist para reemplazar un proceso xinetd que usé con éxito en Windows (Cygwin) y Linux para transmitir una conexión imapd desde un servidor remoto a través de ssh en un puerto en el host local.

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

Cuando ejecuto launchctl list , el agente no se muestra. Cuando intento conectarme al puerto en el host local, se me niega la conexión.

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 agregado una línea a / etc / services para dname-imapd y un puerto no asignado (49022). En última instancia, usaré esto junto con ssh-agent (para que esto funcione sin contraseña) y Thunderbird para recuperar el correo de un sistema muy cerrado.

Hay esencialmente dos preguntas aquí. Uno, ¿cómo sé que mi agente se está cargando (y cómo lo confirmo)? Dos, ¿mi plist es realmente correcto?

Aquí está mi xinetd configuración original:

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 está en una MacBook Pro de El Capitan.

También, probé un túnel ssh directo pero eso no funciona (antes de que alguien lo sugiera). A menos que alguien sepa cómo hacerlo funcionar como inetd y generar cada vez que el cliente de correo se conecte al puerto.

    
pregunta mrmacross 16.12.2015 - 08:03

1 respuesta

1

De acuerdo, abordar primero la segunda pregunta ( ¿es realmente correcto mi plist? ), plutil (en su invocación predeterminada) "lints" (verifica) plist de los archivos para ver si están correctos:

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

Equivalente a:

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

Pasando a su primera pregunta ( ¿cómo sé que mi agente se está cargando (y cómo lo confirmo?) ), aquí hay algunas cosas para ayudar a verificarlo.

Primero, recomiendo agregar el registro para ayudar a la depuración. Me conecto a ~/Library/Logs , así que agregue 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 volver a cargar su plist y luego verifique sus 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 debe comenzar cuando está cargado. Sin embargo, usted dice que launchctl list no muestra al agente. ¿Cambia eso si prueba 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 solo yo, pero me parece que la explicación de man launchd.plist de ProgramArguments es difícil. Me gustaría intentar agregar /usr/bin/ssh como primer string en ProgramArguments y eliminar la entrada para Program . (Luego vuelva a cargar y verifique los registros. Reinicie y verifique los registros si es necesario).

Finalmente, estoy bastante seguro de que @ daniel-Azuelos es correcto, y debes especificar un ProgramArguments como este (he agregado usr/bin/ssh como se mencionó 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, los pocos plist s que puedo encontrar en mi sistema que usan (más de uno) ProgramArguments usan este lenguaje:

<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 la opción bash ' -c y el correspondiente command_string están en argumentos separados.

    
respondido por el John N 10.12.2016 - 16:25

Lea otras preguntas en las etiquetas