GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo configurar D-Bus y SSH X-Forwarding para evitar que SSH se cuelgue al salir?

Solución 1:

Por lanzamiento de dbus(1):

Si DBUS_SESSION_BUS_ADDRESS no está configurado para un proceso que intenta usar D-Bus, de manera predeterminada, el proceso intentará invocar dbus-launch con la opción --autolaunch para iniciar un nuevo bus de sesión o buscar la dirección de bus existente en la pantalla X o en un archivo en ~/.dbus/session-bus/

Cada vez que se produzca un inicio automático, la aplicación que tuvo que iniciar un nuevo bus estará en su propio pequeño mundo; efectivamente puede terminar iniciando una sesión completamente nueva si intenta usar muchos servicios de bus. Esto puede ser subóptimo o incluso totalmente defectuoso, según la aplicación y lo que intente hacer.

Hay dos razones comunes para el inicio automático. Uno es ssh a una máquina remota.

Entonces parece que el truco es iniciar dbus-daemon de forma preventiva, de tal manera que los programas puedan encontrarlo. Yo uso:

[[email protected] ~]$ dbus-launch --exit-with-session gnome-terminal

que, además de gnome-terminal, inicia dbus-daemon y establece $DBUS_SESSION_BUS_ADDRESS dentro de gnome-terminal .

Todos los programas X que se ejecutan desde gnome-terminal se comportan bien, y dbus-launch se limpia automáticamente cuando se cierra gnome-terminal.

Solución 2:

Me pregunto si el problema no se debe a una sesión de dbus desconocida o inactiva.

De hecho, cuando una sesión SSH está abierta, no inicia una sesión dbus. Algunos programas pueden iniciarlo, pero luego la sesión no lo sabe (por lo tanto, no puede cerrarlo).

No saber acerca de la sesión de dbus también significa que los programas que usan dbus pero no lo inician por sí mismos tendrán problemas.

Las secciones de dbus son por máquina y por pantalla X11. Su información se almacena en $HOME/.dbus/session-bus/; sin embargo, el proceso al que se hace referencia allí puede estar cerrado, por lo que se necesita una verificación adicional para determinar si es necesario iniciar dbus o no. Entonces, las variables que hay que exportar a la sesión.

Entonces funciona de maravilla :)

Puse lo siguiente en mi archivo .bash_profile:

# set dbus for remote SSH connections
if [ -n "$SSH_CLIENT" -a -n "$DISPLAY" ]; then
    machine_id=$(LANGUAGE=C hostnamectl|grep 'Machine ID:'| sed 's/^.*: //')
    x_display=$(echo $DISPLAY|sed 's/^.*:\([0-9]\+\)\(\.[0-9]\+\)*$/\1/')
    dbus_session_file="$HOME/.dbus/session-bus/${machine_id}-${x_display}"
    if [ -r "$dbus_session_file" ]; then
            export $(grep '^DBUS.*=' "$dbus_session_file")
            # check if PID still running, if not launch dbus
            ps $DBUS_SESSION_BUS_PID | tail -1 | grep dbus-daemon >& /dev/null
            [ "$?" != "0" ] && export $(dbus-launch) >& /dev/null
    else
            export $(dbus-launch) >& /dev/null
    fi
fi

notas:hostnamectl es parte de systemd y permite recuperar el id de la máquina; el dbus-launch muestra las variables que queremos; usando export $(dbus-launch) recuperamos la salida de dbus-launch y exportamos las variables

si desea que se haga en una sesión no interactiva (por ejemplo, cuando ejecuta un comando desde ssh), intente ponerlo en .bashrc en su lugar (pero tenga en cuenta que bashrc se ejecuta en TODOS los shell abiertos)

Solución 3:

Tuve el mismo problema al intentar ejecutar un comando X remoto y hacer que la sesión se cerrara después de que la herramienta X se hubiera cerrado.

Así que quería correr

ssh -X [email protected] "firefox -no-remote"

Pero tuve que usar:

ssh -X [email protected] 'export \`dbus-launch\`; dbus-launch firefox -no-remote; kill -TERM $DBUS_SESSION_BUS_PID'

Después de cerrar Firefox, esto también cerraría la sesión ssh.

Actualizar :

Esto parece dejar una carga de procesos dbus-daemon ejecutándose en el servidor, por lo que no es óptimo, agregar --exit-with-session en ambas cuentas no ayuda, porque esto revierte el comportamiento original

actualización 2 :esto funciona cuando uso comillas simples (como lo sugiere @lobo) y agrego kill -TERM $DBUS_SESSION_BUS_PID para eliminar los procesos sobrantes de dbus-daemon, según lo propuesto por Holgr Joukl de https://blog.dhampir.no/content/how-to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is -usado)


Linux
  1. Cómo prevenir y recuperarse de la eliminación accidental de archivos en Linux

  2. Cómo instalar y configurar Postfix

  3. Cómo instalar y configurar Dovecot

  4. Cómo instalar y configurar Nginx desde el origen en Linux

  5. Cómo enviar datos al portapapeles local desde una sesión SSH remota

Cómo evitar que se agote el tiempo de espera de SSH

Cómo instalar y configurar Grafana

¿Qué es un DDoS y cómo evitamos que nuestro negocio sea atacado?

¿Cómo me conecto a Linux VPS a través de SSH desde Linux y Windows OS?

Cómo instalar, configurar y habilitar el servicio SSH en Linux

Cómo evitar que SSH se desconecte si ha estado inactivo por un tiempo