GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mengkonfigurasi D-Bus dan SSH X-Forwarding untuk mencegah SSH menggantung saat keluar?

Solusi 1:

Per dbus-launch(1):

Jika DBUS_SESSION_BUS_ADDRESS tidak disetel untuk proses yang mencoba menggunakan D-Bus, secara default proses akan mencoba memanggil peluncuran-dbus dengan opsi --autolaunch untuk memulai bus sesi baru atau menemukan alamat bus yang ada di tampilan X atau dalam file di ~/.dbus/session-bus/

Setiap kali peluncuran otomatis terjadi, aplikasi yang harus memulai bus baru akan berada di dunianya sendiri; itu dapat secara efektif memulai sesi baru jika mencoba menggunakan banyak layanan bus. Ini bisa menjadi kurang optimal atau bahkan rusak total, bergantung pada aplikasi dan apa yang coba dilakukannya.

Ada dua alasan umum untuk peluncuran otomatis. Salah satunya adalah ssh ke mesin jarak jauh.

Jadi sepertinya triknya adalah memulai dbus-daemon terlebih dahulu, sedemikian rupa sehingga program dapat menemukannya. Saya menggunakan:

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

yang, selain dari gnome-terminal, memulai dbus-daemon dan menyetel $DBUS_SESSION_BUS_ADDRESS di dalam gnome-terminal .

Program X apa pun dijalankan dari gnome-terminal lalu berperilaku baik, dan dbus-launch membersihkan dirinya sendiri saat gnome-terminal keluar.

Solusi 2:

Saya bertanya-tanya apakah masalahnya bukan karena sesi dbus yang tidak diketahui atau keluar.

Memang ketika sesi SSH terbuka, itu tidak meluncurkan sesi dbus. Beberapa program mungkin meluncurkannya, tetapi kemudian sesi tidak mengetahuinya (sehingga tidak dapat menutupnya).

Tidak mengetahui tentang sesi dbus juga berarti program yang menggunakan dbus tetapi tidak meluncurkannya sendiri akan mengalami masalah.

bagian dbus adalah per mesin dan per tampilan X11. Infonya disimpan di $HOME/.dbus/session-bus/-namun, proses yang direferensikan di sana mungkin ditutup, sehingga diperlukan pemeriksaan tambahan untuk menentukan apakah meluncurkan dbus diperlukan atau not.Kemudian, variabel yang ada akan diekspor ke sesi.

Maka itu berfungsi seperti pesona :)

Saya meletakkan yang berikut ini di file .bash_profile saya:

# 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

catatan:hostnamectl adalah bagian dari systemd dan memungkinkan untuk mengambil mesin-idthe dbus-launch menampilkan variabel yang kita inginkan; dengan menggunakan export $(dbus-launch) kami mengambil output dari dbus-launch dan mengekspor variabel

jika Anda ingin itu dilakukan pada sesi non-interaktif (misalnya saat menjalankan perintah dari ssh) coba masukkan .bashrc sebagai gantinya (tetapi berhati-hatilah karena bashrc dijalankan di SETIAP shell terbuka)

Solusi 3:

Saya memiliki masalah yang sama ketika mencoba menjalankan perintah X jarak jauh, dan membuat sesi keluar setelah alat X keluar.

Jadi saya ingin lari

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

Tetapi harus menggunakan:

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

Setelah menutup firefox, ini juga akan menutup sesi ssh.

Perbarui :

Hal ini tampaknya meninggalkan banyak proses dbus-daemon yang berjalan di server, jadi ini tidak optimal, menambahkan --exit-with-session pada kedua akun tidak membantu, karena ini mengembalikan perilaku asli

perbarui 2 :ini berfungsi ketika saya menggunakan tanda kutip tunggal, (seperti yang disarankan oleh @lobo) dan menambahkan kill -TERM $DBUS_SESSION_BUS_PID untuk mematikan proses dbus-daemon yang tersisa, seperti yang diusulkan oleh Holgr Joukl dari https://blog.dhampir.no/content/how-to-prevent-ssh-x-from-hanging-on-exit-when-dbus-is -digunakan)


Linux
  1. Bagaimana mencegah dan memulihkan dari penghapusan file yang tidak disengaja di Linux

  2. Cara menginstal dan mengkonfigurasi Postfix

  3. Cara menginstal dan mengkonfigurasi Dovecot

  1. Cegah Tmux Memulai Di Ssh?

  2. Cara Menginstal dan Mengkonfigurasi Nginx dari Sumber di Linux

  3. Cara mengirim data ke clipboard lokal dari sesi SSH jarak jauh

  1. Cara Menginstal dan Mengonfigurasi Klien SSH Putty di Desktop Linux

  2. Bash + Bagaimana Cara Keluar Dari Skrip Sekunder Dan Dari Skrip Utama Pada Kedua Kalinya?

  3. Cara Melakukan SSH dan SCP Tanpa Password dari SSH2 ke OpenSSH