¿Iniciar sesión para SSHD cuando se inicia desde Launchd con la opción `-d`?

Estoy trabajando en OS X 10.8.5, completamente parcheado. Tengo un servidor OpenSSH actualizado instalado para /usr/local/sbinescuchar en el puerto 1522. Los intentos de conexión dan como resultado ssh_exchange_identification: Connection closed by remote host. sudo grep 'sshd' /var/log/* 2>/dev/nullen el servidor no devuelve casi nada, por lo que estoy tratando de recopilar más información en el servidor sobre la causa.

Según man sshd(8), -des el modo de depuración y envía una salida de depuración detallada a un error estándar. Agregué -da ProgramArgumentsen el plist, pero el plist también se establece StandardErrorPathen /dev/null. Así que supongo que la información de depuración se descarta.

Revisé launchctl(1)la página de manual, pero no veo qué debo hacer para modificar StandardErrorPathpara que esté registrado en alguna parte. La página del manual ni siquiera analiza el par nombre/valor.

¿Cómo debo cambiar la configuración para que el registro de depuración se registre en algún lugar y sepa dónde está ese "algún lugar"?


$ cat /System/Library/LaunchDaemons/ssh-7.1.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>Disabled</key>
    <true/>
    <key>Label</key>
    <string>com.openssh.sshd-v7.1</string>
    <key>Program</key>
    <string>/usr/local/sbin/sshd</string>
    <key>ProgramArguments</key>
    <array>
        <string>-i -d</string>
    </array>
    <key>Sockets</key>
    <dict>
            <key>Listeners</key>
            <dict>
                    <key>SockServiceName</key>
                    <string>1522</string>
            </dict>
    </dict>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <false/>
    </dict>
    <key>StandardErrorPath</key>
    <string>/dev/null</string>
    <key>SHAuthorizationRight</key>
    <string>system.preferences</string>
</dict>
</plist>

Respuestas (2)

  1. Para agregar el -dargumento a sshd, debe agregarse como un nuevo elemento a la matriz:

    <string>-d</string>
    

    La sección debería verse así:

    <key>ProgramArguments</key>
        <array>
            <string>-i</string>
            <string>-d</string>
        </array>
    
  2. En lugar de editar los archivos plist directamente, puede usar /usr/libexec/PlistBuddy(-h para mostrar la ayuda).

  3. Hay un script de utilidad ssh-util.rbque puede activar o desactivar el inicio de sesión. Es parte del OpenSSH-189paquete que se encuentra en: opensource.apple.com.

    Enlace a ssh-util.rb

    Estos son los comandos necesarios para ejecutar (como se produce a partir de la secuencia de comandos Ruby):

    /usr/bin/ruby ./ssh-util.rb -l on -v --debug --dryrun
    

    o manualmente:

    sudo /usr/libexec/PlistBuddy -c "add :ProgramArguments:2 string '-ddd'" /System/Library/LaunchDaemons/ssh.plist
    sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
    sudo launchctl load /System/Library/LaunchDaemons/ssh.plist
    sudo touch /var/run/com.openssh.sshd-asl-enabled
    
  4. Cuando termine de depurar, deberá ejecutar:

    /usr/bin/ruby ./ssh-util.rb -l off -v --debug --dryrun 
    

    o manualmente:

    sudo /usr/libexec/PlistBuddy -c "Delete :ProgramArguments:2" /System/Library/LaunchDaemons/ssh.plist
    sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
    sudo launchctl load /System/Library/LaunchDaemons/ssh.plist
    sudo rm -f /var/run/com.openssh.sshd-asl-enabled
    

Notas sobre el registro de OS X

Creo que la información de depuración aún se descartará porque hay que hacer algo con StandardErrorPath.
La 'magia' se hace en la última línea (creando el archivo en /var/run). Acabo de activar el registro (a través de la ssh-util.rbsecuencia de comandos) y /var/log/sshd.logse creó.
En mi respuesta, me vinculé a "Notes on OS X Logging". Mire adentro /etc/asly también eche un vistazo a /etc/asl.conf. (El comentario de (@Jakuje sobre syslog es correcto).

Para registrar correctamente los eventos, sshdno debe establecer -dcambios, ya que esto está reservado para la depuración, pero debe usar el usuario sshd_config(no estoy seguro de dónde se encuentra en OSX).

En sshd_config, hay una opción LogLevel, que puede ajustar a sus necesidades, básicamente el nivel más detallado es DEBUG3, que le brinda mucha información útil para la depuración.

Si lo configuro LogLevel=DEBUG3, ¿no se descartará porque StandardErrorPath=/dev/null? (Lamento tener que preguntar. Normalmente no administro OpenSSH. Por lo general, "simplemente funciona").
No se registra en stderr (al menos en otro * nix), se registra usando syslog u otro registrador proporcionado por el sistema (generalmente usando /dev/logsocket).