GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie konfiguriere ich D-Bus und SSH X-Forwarding, um zu verhindern, dass SSH beim Beenden hängen bleibt?

Lösung 1:

Per dbus-launch(1):

Wenn DBUS_SESSION_BUS_ADDRESS nicht für einen Prozess gesetzt ist, der versucht, D-Bus zu verwenden, wird der Prozess standardmäßig versuchen, dbus-launch mit der Option --autolaunch aufzurufen, um einen neuen Sitzungsbus zu starten oder die vorhandene Busadresse auf dem X-Display zu finden oder in einer Datei in ~/.dbus/session-bus/

Immer wenn ein Autostart stattfindet, befindet sich die Anwendung, die einen neuen Bus starten musste, in ihrer eigenen kleinen Welt; Es kann effektiv dazu führen, dass eine ganz neue Sitzung gestartet wird, wenn es versucht, viele Busdienste zu nutzen. Dies kann suboptimal oder sogar völlig kaputt sein, je nach App und was sie zu tun versucht.

Es gibt zwei häufige Gründe für den automatischen Start. Einer ist ssh zu einem entfernten Rechner.

Der Trick scheint also darin zu bestehen, dbus-daemon präventiv zu starten, so dass Programme ihn finden können. Ich verwende:

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

die, abgesehen von gnome-terminal, dbus-daemon startet und $DBUS_SESSION_BUS_ADDRESS innerhalb von gnome-terminal setzt .

Alle X-Programme, die von gnome-terminal ausgeführt werden, verhalten sich dann gut, und dbus-launch räumt nach sich selbst auf, wenn gnome-terminal beendet wird.

Lösung 2:

Ich frage mich, ob das Problem nicht wegen einer unbekannten oder nicht existierenden dbus-Sitzung auftritt.

Wenn eine SSH-Sitzung geöffnet ist, wird tatsächlich keine Dbus-Sitzung gestartet. Einige Programme können es starten, aber dann weiß die Sitzung nichts davon (daher kann es nicht geschlossen werden).

Nichtwissen über die dbus-Sitzung bedeutet auch, dass Programme, die dbus verwenden, es aber nicht selbst starten, Probleme haben werden.

dbus-Abschnitte gelten pro Maschine und pro X11-Anzeige. Ihre Informationen werden in $HOME/.dbus/session-bus/ gespeichert. Der dort referenzierte Prozess kann jedoch geschlossen sein, sodass eine zusätzliche Überprüfung erforderlich ist, um festzustellen, ob das Starten von dbus erforderlich ist oder nicht. Dann sollen die dortigen Variablen in die Session exportiert werden.

Dann funktioniert es wie am Schnürchen :)

Ich habe Folgendes in meine .bash_profile-Datei eingefügt:

# 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

Anmerkungen:Hostnamectl ist Teil von Systemd und ermöglicht das Abrufen der Maschinen-ID. Der dbus-Launch zeigt die gewünschten Variablen an. indem Sie export $(dbus-launch) verwenden wir rufen die Ausgabe von dbus-launch ab und exportieren die Variablen

wenn Sie möchten, dass es in einer nicht-interaktiven Sitzung ausgeführt wird (z. B. wenn Sie einen Befehl von ssh ausführen), versuchen Sie es stattdessen in .bashrc (aber beachten Sie, dass bashrc bei JEDER geöffneten Shell ausgeführt wird)

Lösung 3:

Ich hatte das gleiche Problem, als ich versuchte, einen Remote-X-Befehl auszuführen und die Sitzung zu beenden, nachdem das X-Tool beendet wurde.

Also wollte ich rennen

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

Musste aber verwenden:

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

Nach dem Schließen von Firefox würde dies auch die SSH-Sitzung schließen.

Aktualisieren :

Dies scheint eine Menge dbus-daemon-Prozesse auf dem Server laufen zu lassen, daher ist dies nicht optimal, das Hinzufügen von --exit-with-session auf beiden Konten hilft nicht, da dies das ursprüngliche Verhalten umkehrt

Aktualisierung 2 :Dies funktioniert, wenn ich einfache Anführungszeichen verwende (wie von @lobo vorgeschlagen) und kill -TERM $DBUS_SESSION_BUS_PID hinzufüge um die verbleibenden dbus-daemon-Prozesse zu beenden, wie von Holgr Joukl von https://blog.dhampir.no/content/how-to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is vorgeschlagen -gebraucht)


Linux
  1. So installieren und konfigurieren Sie Postfix

  2. So installieren und konfigurieren Sie Dovecot

  3. Verhindern, dass Tmux auf Ssh startet?

  4. Bash + So beenden Sie beide Male das sekundäre Skript und das Hauptskript

  5. So führen Sie SSH und SCP ohne Passwort von SSH2 zu OpenSSH durch

So verhindern Sie ein Timeout von SSH

So installieren und konfigurieren Sie Grafana

Was ist ein DDoS und wie verhindern wir, dass unser Unternehmen angegriffen wird?

Wie verbinde ich mich mit Linux VPS über SSH von Linux und Windows OS?

So installieren, konfigurieren und aktivieren Sie den SSH-Dienst unter Linux

So verhindern Sie, dass SSH die Verbindung trennt, wenn es eine Weile inaktiv war