(Chuyển thể từ Linux: wmctrl không thể mở hiển thị khi phiên được bắt đầu qua màn hình ssh + )
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, mà thường là :0
khi bạn đang đăng nhập tại địa phương hoặc :10
, :11
vv khi bạn đang đăng nhập từ xa (nhưng số lượng có thể thay đổi tùy thuộc vào bao nhiêu X kết nối đang hoạt động). Địa chỉ của màn hình thường được chỉ định trong DISPLAY
biến môi trường.
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 thẩm quyền X, đó là một tập hợp các bản ghi của biểu mẫu hình thức :42
có cookie cookie 123456
. Tệp thẩm quyền X thường được chỉ định trong XAUTHORITY
biến môi trường. Nếu $XAUTHORITY
không được đặt, 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 né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 DISPLAY
và XAUTHORITY
:
Bạn có thể bắt đầu một cách có hệ thống một phiên màn hình từ máy tính để bàn của bạn, có thể tự động trong các 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 :
(sẽ bao gồm tất cả các trường hợp bạn có khả năng 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 DISPLAY
và XAUTHORITY
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 DISPLAY
và XAUTHORITY
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 đó để làm cho 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, nên không có vấn đề gì nếu bạn giữ các giá trị cũ ~/.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 kết nối X TCP (mặc định Debian tắt chúng). 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 có 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 này thiếu đúng đắn trích dẫn, nhưng trong trường hợp cụ thể này $DISPLAY
và $XAUTHORITY
sẽ không chứa bất kỳ metacharater vỏ.