Cargando usuario LaunchAgent con éxito

Creé 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 sshde un puerto en el host local.

El plutilcomando dice que mi configuración está bien. launchctl load path-to-plistse ejecuta sin errores.

Cuando ejecuto launchctl listel agente no se muestra. Cuando intento conectarme al puerto en el host local, se rechaza 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 funcione 'sin contraseña') y Thunderbird para recuperar el correo de un sistema muy bloqueado.

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 configuración original de xinetd :

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 un El Capitán Macbook Pro.

Además, probé un túnel ssh directo pero eso realmente 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 conecta al puerto.

Creo que su matriz ProgramArgumentsdebe dividirse en 4 <string>…</string>, uno para cada uno argv[i], como <string>-F</string>….
Las listas de trabajo existentes no parecen tener problemas con más de una cadena dentro de una etiqueta de cadena.

Respuestas (1)

De acuerdo, primero aborde su segunda pregunta (¿ mi plist es realmente correcta? ), plutil(en su invocación predeterminada) "lints" (verifica) plistarchivos para ver si son correctos:

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

Equivalente a:

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

Volviendo 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 verificar eso.

Primero, recomendaría 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 plisty luego verifique sus registros:

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

Algunas observaciones adicionales:

Según tengo entendido inetdCompatibility, el agente debe iniciarse cuando se carga. Sin embargo, dices que eso launchctl listno muestra al agente. ¿Eso cambia si lo intentas launchctl start com.my.ssh_tunneldespués de cargar el archivo plist? ¿Los registros muestran algo nuevo?

No entiendo completamente la relación entre Programy ProgramArguments- podría ser solo yo, pero encuentro man launchd.plistla explicación de ProgramArgumentsdifícil. Me inclinaría a intentar agregar /usr/bin/sshcomo primer stringlugar ProgramArgumentsy 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 debe especificar su ProgramArgumentsgusto (lo agregué usr/bin/sshcomo 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 que los pocos plists que puedo encontrar en mi sistema que usan (más de uno) ProgramArgumentsusan este modismo:

<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 bashla opción de -cy la correspondiente command_stringestán en argumentos separados.