GNU/Linux >> Linux Esercitazione >  >> Linux

Come configurare D-Bus e SSH X-Forwarding per evitare che SSH si blocchi all'uscita?

Soluzione 1:

Per lancio dbus(1):

Se DBUS_SESSION_BUS_ADDRESS non è impostato per un processo che tenta di utilizzare D-Bus, per impostazione predefinita il processo tenterà di richiamare dbus-launch con l'opzione --autolaunch per avviare un nuovo bus di sessione o trovare l'indirizzo del bus esistente sul display X o in un file in ~/.dbus/session-bus/

Ogni volta che si verifica un avvio automatico, l'applicazione che doveva avviare un nuovo bus si troverà nel suo piccolo mondo; può effettivamente finire per iniziare una sessione completamente nuova se tenta di utilizzare molti servizi di autobus. Questo può essere subottimale o addirittura totalmente rotto, a seconda dell'app e di ciò che cerca di fare.

Esistono due motivi comuni per l'avvio automatico. Uno è ssh verso una macchina remota.

Quindi sembra che il trucco sia avviare preventivamente dbus-daemon, in modo tale che i programmi possano trovarlo. Uso:

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

che, a parte gnome-terminal, avvia dbus-daemon e imposta $DBUS_SESSION_BUS_ADDRESS all'interno di gnome-terminal .

Tutti i programmi X eseguiti da gnome-terminal si comportano bene e dbus-launch si pulisce da solo quando gnome-terminal esce.

Soluzione 2:

Mi chiedo se il problema non sia causato da una sessione dbus sconosciuta o in uscita.

Infatti quando una sessione SSH è aperta, non avvia una sessione dbus. Alcuni programmi potrebbero avviarlo, ma la sessione non lo sa (quindi non può chiuderlo).

Non conoscere la sessione dbus significa anche che i programmi che usano dbus ma non lo avviano da soli avranno problemi.

le sezioni dbus sono per macchina e per display X11. Le loro informazioni sono memorizzate in $HOME/.dbus/session-bus/-tuttavia, il processo a cui si fa riferimento potrebbe essere chiuso, quindi è necessario un ulteriore controllo per determinare se è necessario avviare dbus o not.Poi, le variabili presenti devono essere esportate nella sessione.

Quindi funziona a meraviglia :)

Ho inserito quanto segue nel mio file .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

note:hostnamectl fa parte di systemd e permette di recuperare il machine-id il dbus-launch mostra le variabili che vogliamo; utilizzando export $(dbus-launch) recuperiamo l'output di dbus-launch ed esportiamo le variabili

se vuoi che venga eseguito su sessio non interattivo (ad esempio quando esegui un comando da ssh) prova invece a inserirlo in .bashrc (ma attenzione che bashrc viene eseguito su EVEERY shell aperta)

Soluzione 3:

Ho avuto lo stesso problema durante il tentativo di eseguire un comando X remoto e di chiudere la sessione dopo che lo strumento X era terminato.

Quindi volevo correre

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

Ma ho dovuto usare:

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

Dopo aver chiuso firefox, questo chiuderebbe anche la sessione ssh.

Aggiorna :

Questo sembra lasciare un carico di processi dbus-daemon in esecuzione sul server, quindi non è ottimale, l'aggiunta di --exit-with-session su entrambi gli account non aiuta, perché questo ripristina il comportamento originale

aggiornamento 2 :funziona quando uso le virgolette singole (come suggerito da @lobo) e aggiungo kill -TERM $DBUS_SESSION_BUS_PID per uccidere i processi dbus-daemon rimanenti, come proposto da Holgr Joukl da https://blog.dhampir.no/content/how-to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is -usato)


Linux
  1. Come prevenire e ripristinare l'eliminazione accidentale di file in Linux

  2. Come installare e configurare Postfix

  3. Come installare e configurare il client Putty SSH su desktop Linux

  4. Impedire a Tmux di avviarsi su Ssh?

  5. Bash + Come uscire dallo script secondario e dallo script principale in entrambi i casi?

Come prevenire il timeout di SSH

Come installare e configurare Grafana

Che cos'è un DDoS e come possiamo impedire che la nostra attività venga attaccata?

Come mi collego a Linux VPS tramite SSH da Linux e Windows OS?

Come installare, configurare e abilitare il servizio SSH in Linux

Come impedire a SSH di disconnettersi se è rimasto inattivo per un po'