GNU/Linux >> Znalost Linux >  >> Linux

Jak nakonfigurovat D-Bus a SSH X-Forwarding, aby se zabránilo zavěšení SSH při ukončení?

Řešení 1:

Pro dbus-launch(1):

Pokud DBUS_SESSION_BUS_ADDRESS není nastaveno pro proces, který se pokouší použít D-Bus, ve výchozím nastavení se proces pokusí vyvolat dbus-launch s volbou --autolaunch, aby spustil novou sběrnici relace nebo našel existující adresu sběrnice na displeji X nebo v souboru v ~/.dbus/session-bus/

Kdykoli dojde k automatickému spuštění, aplikace, která musela spustit novou sběrnici, bude ve svém vlastním malém světě; může efektivně skončit zahájením zcela nové relace, pokud se pokusí využít mnoho autobusových služeb. To může být neoptimální nebo dokonce zcela nefunkční v závislosti na aplikaci a na tom, co se snaží udělat.

Existují dva běžné důvody pro automatické spouštění. Jedním z nich je ssh ke vzdálenému počítači.

Zdá se tedy, že trik spočívá v tom, že dbus-daemon spustíte preventivně tak, aby jej programy našly. Používám:

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

který kromě gnome-terminal spustí dbus-daemon a nastaví $DBUS_SESSION_BUS_ADDRESS v rámci gnome-terminal .

Jakékoli X programy spouštěné z gnome-terminálu se pak chovají pěkně a dbus-launch se po ukončení gnome-terminálu sám vyčistí.

Řešení 2:

Zajímalo by mě, jestli problém nenastal kvůli neznámé nebo neukončené relaci dbus.

Když je otevřená relace SSH, nespustí relaci dbus. Některé programy jej mohou spustit, ale pak o tom relace neví (proto ji nemůže ukončit).

Nevědět o relaci dbus také znamená, že programy, které používají dbus, ale samy jej nespustí, budou mít problémy.

Sekce dbus jsou na stroji a na displeji X11. Jejich informace jsou uloženy v $HOME/.dbus/session-bus/-avšak proces, na který se odkazuje, může být uzavřen, takže je potřeba další kontrola, aby se zjistilo, zda je potřeba spustit dbus nebo ne. Pak jsou proměnné, které se mají exportovat do relace.

Pak to funguje jako kouzlo :)

Do svého souboru .bash_profile jsem vložil následující:

# 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

poznámky:hostnamectl je součástí systemd a umožňuje získat ID stroje, dbus-launch zobrazí proměnné, které chceme; pomocí export $(dbus-launch) načteme výstup dbus-launch a exportujeme proměnné

pokud chcete, aby to bylo provedeno na neinteraktivním sessio (např. při spuštění příkazu z ssh), zkuste to místo toho vložit do .bashrc (ale pozor, bashrc se spouští v KAŽDÉM otevřeném shellu)

Řešení 3:

Měl jsem stejný problém, když jsem se pokoušel spustit vzdálený příkaz X a provést ukončení relace po ukončení nástroje X.

Tak jsem chtěl běžet

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

Ale musel použít:

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

Po zavření firefoxu to také ukončí relaci ssh.

Aktualizovat :

Zdá se, že na serveru je spuštěno zatížení procesů dbus-daemon, takže to není optimální, přidání --exit-with-session na oba účty nepomůže, protože to vrátí původní chování

aktualizace 2 :toto funguje, když používám jednoduché uvozovky (jak navrhuje @lobo) a přidávám kill -TERM $DBUS_SESSION_BUS_PID zabít zbylé procesy dbus-daemon, jak navrhuje Holgr Joukl z https://blog.dhampir.no/content/how-to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is -použité)


Linux
  1. Jak zabránit náhodnému smazání souboru a zotavit se z něj v Linuxu

  2. Jak nainstalovat a nakonfigurovat Postfix

  3. Jak nainstalovat a nakonfigurovat Dovecot

  1. Jak nainstalovat a nakonfigurovat klienta Putty SSH na ploše Linux

  2. Zabránit spuštění Tmux na Ssh?

  3. Bash + Jak opustit sekundární skript a hlavní skript v obou případech?

  1. Jak nainstalovat a nakonfigurovat Nginx ze zdroje na Linuxu

  2. Jak vynutím odpojit obrazovku od jiné relace SSH?

  3. Jak ukončím připojení SSH?