it-swarm-vi.com

Mở một cửa sổ trên màn hình X từ xa (tại sao "Không thể mở màn hình")?

Ngày xửa ngày xưa,

DISPLAY=:0.0 totem /path/to/movie.avi

sau khi ssh 'vào máy tính để bàn của tôi từ máy tính xách tay của tôi sẽ khiến totem chơi movie.avi trên máy tính để bàn của tôi.

Bây giờ nó đưa ra lỗi:

No protocol specified
Cannot open display:

Tôi đã cài đặt lại Debian nén khi nó hoạt động ổn định trên cả hai máy tính và tôi đoán rằng tôi đã phá vỡ cấu hình.

Tôi đã googled về điều này, và không thể cho cuộc sống của tôi tìm ra những gì tôi phải làm.

(VLC có giao diện HTTP hoạt động, nhưng nó không thuận tiện như ssh.)

Vấn đề tương tự phát sinh khi tôi cố gắng chạy nó từ một công việc định kỳ.

83
justin cress

(Được điều chỉnh từ Linux: wmctrl không thể mở hiển thị khi phiên được bắt đầu qua ssh + screen )

HIỂN THỊ và QUYỀN

Một chương trình X cần hai thông tin để kết nối với màn hình X.

  • Nó cần địa chỉ của màn hình, thường là :0 Khi bạn đăng nhập cục bộ hoặc :10, :11, V.v. khi bạn đăng nhập từ xa (nhưng số lượng có thể thay đổi tùy thuộc vào số lượng kết nối X đang hoạt động). Địa chỉ của màn hình thường được chỉ định trong biến môi trường DISPLAY.

  • Nó cần mật khẩu cho màn hình. Mật khẩu hiển thị X được gọi là cookie ma thuật . Cookie ma thuật không được chỉ định trực tiếp: chúng luôn được lưu trữ trong các tệp ủy quyền X, là tập hợp các bản ghi của biểu mẫu hình thức :42 Có cookie 123456. Tệp ủy quyền X thường được chỉ định trong biến môi trường XAUTHORITY. Nếu $XAUTHORITY Không được đặt, các chương trình sẽ sử dụng ~/.Xauthority.

Bạn đang cố gắng hành động trên các cửa sổ được hiển thị trên máy tính để bàn của bạn. Nếu bạn là người duy nhất sử dụng máy tính để bàn của bạn, rất có thể tên hiển thị là :0. Việc tìm vị trí của tệp ủy quyền X khó hơn, vì với gdm như được thiết lập trong phần nén Debian hoặc Ubuntu 10.04, nó nằm trong một tệp có tên được tạo ngẫu nhiên. (Trước đây bạn không gặp vấn đề gì vì các phiên bản trước của gdm đã sử dụng cài đặt mặc định, tức là cookie được lưu trữ trong ~/.Xauthority.).)

Lấy các giá trị của các biến

Dưới đây là một số cách để có được các giá trị của DISPLAYXAUTHORITY:

  • Bạn có thể bắt đầu một cách có hệ thống phiên màn hình từ máy tính để bàn của mình, có thể tự động trong tập lệnh đăng nhập của bạn (từ ~/.profile; Nhưng chỉ thực hiện nếu đăng nhập trong X: test nếu DISPLAY được đặt thành giá trị bắt đầu với : (sẽ bao gồm tất cả các trường hợp bạn có thể gặp phải)). Trong ~/.profile:

    case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    

    Sau đó, trong phiên ssh:

    screen -d -r local
    
  • Bạn cũng có thể lưu các giá trị của DISPLAYXAUTHORITY trong một tệp và gọi lại các giá trị. Trong ~/.profile:

    case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    

    Trong phiên ssh:

    . ~/.local-display-setup.sh
    screen
    
  • Bạn có thể phát hiện các giá trị của DISPLAYXAUTHORITY từ một quy trình đang chạy. Điều này là khó khăn hơn để tự động hóa. Bạn phải tìm ra PID của một quá trình được kết nối với màn hình mà bạn muốn làm việc, sau đó lấy các biến môi trường từ /proc/$pid/environ (eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=') ¹).

Sao chép cookie

Một cách tiếp cận khác (theo gợi ý của Arrowmaster ) là không cố lấy giá trị $XAUTHORITY Trong phiên ssh, mà thay vào đó, hãy tạo phiên X sao chép cookie của nó vào ~/.Xauthority. Vì cookie được tạo mỗi lần bạn đăng nhập, sẽ không có vấn đề gì nếu bạn giữ các giá trị cũ trong ~/.Xauthority.

Có thể có một vấn đề bảo mật nếu thư mục chính của bạn có thể truy cập qua NFS hoặc hệ thống tệp mạng khác cho phép quản trị viên từ xa xem nội dung của nó. Họ vẫn cần kết nối với máy của bạn bằng cách nào đó, trừ khi bạn đã bật các kết nối X TCP (Debian tắt chúng theo mặc định). Vì vậy, đối với hầu hết mọi người, điều này không áp dụng (không NFS) hoặc không phải là vấn đề (không có kết nối X TCP).

Để sao chép cookie khi bạn đăng nhập vào phiên X của máy tính để bàn, hãy thêm các dòng sau vào ~/.xprofile Hoặc ~/.profile (Hoặc một số tập lệnh khác được đọc khi bạn đăng nhập):

case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac

¹ Về nguyên tắc, điều này thiếu trích dẫn thích hợp, nhưng trong trường hợp cụ thể này $DISPLAY$XAUTHORITY Sẽ không chứa bất kỳ siêu vi khuẩn Shell nào.

Tôi đã giải quyết vấn đề này bằng cách thêm

xhost +si:localuser:$USER

đến ~/.xprofile. Tôi không biết điều này có an toàn không (tôi rất muốn nghe những gì dân gian hiểu biết hơn), nhưng tôi đoán rằng nó tốt hơn nhiều so với việc tắt kiểm soát truy cập (với xhost +) như thường được đề xuất khi bạn google cho vấn đề này.

20
edam

Bạn cần phải export DISPLAY=:0.0

7
asoundmove

Làm việc cho tôi, debian wheezy -> ub Ubuntu đáng tin cậy.

Lưu ý: trong trường hợp này, máy chủ không chạy trình quản lý hiển thị, đó là máy ảo 'không đầu' không có card đồ họa hoặc màn hình đi kèm.

[email protected]:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
[email protected]:~$ ssh -C -R 6000:127.0.0.1:6000 [email protected]
X11 forwarding request failed on channel 0
[email protected]:~$ export DISPLAY=:0.0
[email protected]:~$ xterm

Màn hình X trên máy tính xách tay hiển thị đầu ra của xterm đang chạy trên máy chủ.

Gỡ lỗi bằng cách sử dụng:

[email protected]:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
[email protected]:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
[email protected]:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
[email protected]:~$ strace xterm

strace sẽ tiết lộ vô số thông tin chi tiết về những gì nó đang làm, bạn sẽ có thể đoán nó bị kẹt ở đâu - chờ kết nối hoặc bất cứ điều gì.

Trong một dòng ..

ssh -C -R 6000:127.0.0.1:6000 [email protected] "DISPLAY=:0.0 xterm"
3
jmullee