Làm cách nào để định cấu hình D-Bus và SSH X-Forwarding để ngăn SSH treo khi thoát?


19

Tôi đang cố gắng chạy các ứng dụng Gnome khác nhau thông qua X11 Forwarding và SSH. Một số ứng dụng sẽ khiến ứng dụng 'dbus-launch' được sinh ra đầu tiên. Vấn đề là dbus-launch không đóng khi thoát ứng dụng X và do đó phải bị hủy trước khi phiên SSH có thể được đóng đúng cách.

Tôi giả sử vấn đề là các ứng dụng X / Gnome không thể kết nối với trình nền bus tin nhắn chính và do đó phải khởi chạy bản sao của chính chúng? Làm thế nào tôi có thể sửa lỗi này? Hay tôi còn thiếu gì?

Đây là một ví dụ. Tôi đã bật X11 Forwarding, tất cả dường như hoạt động tốt.

[me@host ~]$ gnome-calculator &
[1] 4803

(ở đây chương trình gcalctool khởi chạy và được hiển thị cho máy chủ X loại bỏ của tôi (Xming))

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4803 pts/0    00:00:00 gnome-calculator
 4807 pts/0    00:00:00 dbus-launch
 4870 pts/0    00:00:00 ps

(bây giờ, sau khi đóng ứng dụng gcalctool trong phiên từ xa)

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4807 pts/0    00:00:00 dbus-launch
 4898 pts/0    00:00:00 ps

Lưu ý rằng dbus-launch vẫn hoạt động. Và phần tồi tệ nhất, điều này ngăn kết nối SSH đóng lại cho đến khi nó bị giết.

Lưu ý rằng trình nền tin nhắn toàn hệ thống đang chạy, như có thể thấy ở đây:

[me@host ~]$ ps ax
 4696 ?     Ssl   0:00 dbus-daemon --system

Tôi đang thiếu gì ở đây? Tôi chưa bao giờ thấy hành vi này trước đây. Có lẽ, tôi chỉ từng thấy các ứng dụng có thể kết nối với daemon tin nhắn không bị cản trở? Tôi đã xem trong / etc / dbus-1 để tìm câu trả lời, nhưng không biết phải tìm gì.

Xin được cảm ơn trước về sự giúp đỡ.

[CHỈNH SỬA]

OK, tôi nhận ra rằng tôi đang gặp một vấn đề phổ biến. Có vẻ như đây là một hành vi khá phổ biến, nhưng không có giải pháp tốt. Tôi đang gặp sự cố treo SSH vì dbus-launch vẫn hoạt động trong tty. Nhưng dường như không có cách nào tốt để khiến dbus-launch diễn ra lặng lẽ.

Nhìn vào /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh sẽ đưa ra một số manh mối về những gì được cho là xảy ra với phiên X "bình thường". Điều này tất nhiên không hoạt động khi chỉ gọi một ứng dụng X đến X Server từ xa.

Như một cách giải quyết tạm thời, tôi đã thêm phần này vào .bash_logout của mình:

# ~/.bash_logout
pkill -u $USER -t `tty | cut -d '/' -f 3,4` dbus-launch

Điều này sẽ cho phép phiên SSH đóng, nhưng nó cảm thấy không ổn. Có giải pháp nào tốt hơn ngoài kia không? Cách thích hợp để chạy các ứng dụng X11 từ xa mà không cần dbus cản trở?

Câu trả lời:


15

Mỗi dbus-launch (1):

Nếu DBUS_SESSION_BUS_ADDRESS không được đặt cho quy trình cố gắng sử dụng D-Bus, theo mặc định, quy trình sẽ cố gắng gọi dbus-launch bằng tùy chọn --autolaunch để khởi động bus phiên mới hoặc tìm địa chỉ bus hiện có trên màn hình X hoặc trong một tệp trong ~ / .dbus / session-bus /

Bất cứ khi nào một autolaunch xảy ra, ứng dụng phải khởi động một chiếc xe buýt mới sẽ ở trong thế giới nhỏ bé của chính nó; nó thực sự có thể kết thúc bắt đầu một phiên hoàn toàn mới nếu nó cố gắng sử dụng nhiều dịch vụ xe buýt. Điều này có thể là tối ưu hoặc thậm chí hoàn toàn bị phá vỡ, tùy thuộc vào ứng dụng và những gì nó cố gắng làm.

Có hai lý do phổ biến cho autolaunch. Một là ssh đến một máy từ xa.

Vì vậy, có vẻ như mẹo là bắt đầu dbus-daemon một cách nhanh chóng, theo cách mà các chương trình có thể tìm thấy nó. Tôi sử dụng:

[me@host ~]$ dbus-launch --exit-with-session gnome-terminal

trong đó, ngoài gnome-terminal, khởi động dbus-daemon và đặt $ DBUS_SESSION_BUS_ADDRESS trong gnome-terminal .

Bất kỳ chương trình X nào chạy từ gnome-terminal sau đó sẽ hoạt động tốt và dbus-launch sẽ tự dọn sạch khi gnome-terminal thoát.


Tôi đánh dấu đây là câu trả lời, tôi thích giải pháp của bạn ở đây. Cảm ơn bạn. Trước tiên, khởi chạy một thiết bị đầu cuối gnome và sau đó khởi chạy các chương trình bổ sung từ nó dường như để khắc phục sự cố của tôi. Đây có phải là hành vi mới, mặc dù? Tôi dường như nhớ rằng có thể khởi chạy nhiều cửa sổ chuyển tiếp X mà không gặp vấn đề này. Có lẽ các chương trình Gnome mới hơn đang sử dụng Dbus, vì vậy tôi chưa thấy điều này?
taftster

2

Tôi tự hỏi nếu vấn đề không xảy ra do một phiên dbus không rõ hoặc không có.

Thật vậy, khi một phiên SSH được mở, nó không khởi chạy một phiên dbus. Một số chương trình có thể khởi chạy nó, nhưng sau đó phiên không biết về nó (do đó không thể đóng nó).

Không biết về phiên dbus cũng có nghĩa là các chương trình sử dụng dbus nhưng bản thân nó không khởi chạy sẽ có vấn đề.

các phần dbus là trên mỗi máy và mỗi màn hình X11. Thông tin của họ được lưu trữ trong $ HOME / .dbus / session-bus / - tuy nhiên, quy trình được tham chiếu ở đó có thể bị đóng, do đó cần kiểm tra thêm để xác định xem có cần khởi chạy dbus hay không. Sau đó, các biến có để ber xuất sang phiên.

Sau đó, nó hoạt động như một nét duyên dáng :)

Tôi đặt phần sau vào tệp .bash_profile của mình:

# 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

lưu ý: hostnamectl là một phần của systemd và cho phép truy xuất id máy, dbus-launch hiển thị các biến chúng ta muốn; bằng cách sử dụng, export $(dbus-launch)chúng tôi lấy ra đầu ra của dbus-launch và xuất các biến

nếu bạn muốn nó được thực hiện trên sessio không tương tác (ví dụ: khi chạy lệnh từ ssh), hãy thử đặt nó vào .bashrc thay vào đó (nhưng hãy cẩn thận khi bashrc được thực thi tại EVEERY shell shell)


1

Tôi gặp vấn đề tương tự khi thử chạy lệnh X từ xa và thực hiện thoát phiên sau khi công cụ X đã thoát.

Vì vậy, tôi muốn chạy

ssh -X user@remotehost "firefox -no-remote"

Nhưng phải sử dụng:

ssh -X user@remotehost 'export \`dbus-launch\`; dbus-launch firefox -no-remote; kill -TERM $DBUS_SESSION_BUS_PID'

Sau khi đóng firefox, nó cũng sẽ đóng phiên ssh.

Cập nhật :

Điều này dường như để lại một tải các quy trình dbus-daemon đang chạy trên máy chủ, vì vậy điều này không tối ưu, việc thêm --exit-with-session trên cả hai tài khoản không giúp ích gì, vì điều này hoàn nguyên hành vi ban đầu

cập nhật 2 : điều này không hoạt động khi tôi sử dụng các trích dẫn đơn, (như được đề xuất bởi @lobo) và thêm vào kill -TERM $DBUS_SESSION_BUS_PIDđể tiêu diệt các quy trình dbus-daemon còn sót lại, như đề xuất của Holgr Joukl từ https://blog.dhampir.no/content/how- to-ngăn chặn-ssh-x-từ-treo-on-exit-khi-dbus-được sử dụng )


Bạn phải sử dụng dấu ngoặc đơn trong lệnh cuối cùng (nếu không dbus-launchđược chạy cục bộ ), nhưng sau đó nó hoạt động. Cảm ơn!
l0b0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.