it-swarm-vi.com

Có một lệnh để liệt kê tất cả các màn hình mở trên máy không?

Khi SSH vào máy tính của tôi (đừng hỏi, đó là một cách giải quyết), tôi không thể khởi động các ứng dụng đồ họa mà không chạy:

export DISPLAY=:0.0

Nếu tôi chạy cái này trước và sau đó chạy một ứng dụng đồ họa, mọi thứ sẽ ổn. Nếu không, nó không hoạt động, không có màn hình để đính kèm.

Có một lệnh để liệt kê tất cả các màn hình có sẵn (nghĩa là: tất cả các giá trị có thể) trên một máy không?

78
Naftuli Kay

Nếu bạn muốn kết nối X được chuyển tiếp qua SSH, bạn cần kích hoạt nó ở cả phía máy chủ và phía máy khách. (Tùy thuộc vào phân phối, nó có thể được bật hoặc tắt theo mặc định.) Về phía máy chủ, hãy đảm bảo rằng bạn có X11Forwarding yes trong /etc/sshd_config (hoặc /etc/ssh/sshd_config hoặc bất cứ nơi nào tập tin cấu hình). Về phía khách hàng, vượt qua -X tùy chọn cho lệnh ssh hoặc đặt ForwardX11 trong ~/.ssh/config .

Nếu bạn chạy ssh -X localhost, bạn sẽ thấy rằng $DISPLAY có khả năng) localhost:10.0. Tương phản với :0.0, là giá trị khi bạn không được kết nối qua SSH. (Các .0 một phần có thể được bỏ qua; đó là số màn hình, nhưng hiếm khi sử dụng nhiều màn hình.) Có hai dạng màn hình X mà bạn có thể gặp phải:

  • Hiển thị cục bộ, không có gì trước :.
  • TCP hiển thị, với tên máy chủ trước :.

Với ssh -X localhost, bạn có thể truy cập máy chủ X thông qua cả hai màn hình, nhưng các ứng dụng sẽ sử dụng một phương thức khác: :NUMBER truy cập máy chủ qua ổ cắm cục bộ và bộ nhớ dùng chung, trong khi HOSTNAME:NUMBER truy cập máy chủ qua TCP, tốc độ chậm hơn và vô hiệu hóa một số tiện ích mở rộng.

Lưu ý rằng bạn cần một hình thức ủy quyền để truy cập máy chủ X, được gọi là cookie và thường được lưu trữ phía sau hậu trường trong tệp ~/.Xauthority. Nếu bạn đang sử dụng ssh để truy cập tài khoản người dùng khác hoặc nếu bản phân phối của bạn đặt cookie vào một tệp khác, bạn có thể thấy rằng DISPLAY=:0 không hoạt động trong phiên SSH (nhưng ssh -X sẽ, nếu nó được kích hoạt trong máy chủ; bạn không bao giờ cần phải làm phiền với XAUTHORITY khi làm ssh -X). Nếu đó là một vấn đề, bạn cần đặt biến môi trường XAUTHORITY hoặc lấy cookie của người dùng khác .

Để trả lời câu hỏi thực tế của bạn:

  • Màn hình cục bộ tương ứng với một ổ cắm trong /tmp/.X11-unix.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • Màn hình từ xa tương ứng với các cổng mở TCP trên 6000; truy cập số hiển thị N trên máy M được thực hiện bằng cách kết nối với TCP cổng 6000 + N trên máy M. Từ máy M chính nó:

    netstat -lnt | awk '
      sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
        print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
      }'
    

    (Phần còn lại của gạch đầu dòng này chỉ có lợi cho học tập.)

    Từ một máy khác, bạn có thể sử dụng nmap -p 6000-6099 Host_name để thăm dò mở TCP cổng trong phạm vi thông thường. Ngày nay hiếm khi có máy chủ X lắng nghe ổ cắm TCP, đặc biệt là bên ngoài giao diện loopback.

    Nói đúng ra, một ứng dụng khác có thể đang sử dụng một cổng trong phạm vi thường được sử dụng bởi các máy chủ X. Bạn có thể biết liệu máy chủ X có lắng nghe hay không bằng cách kiểm tra chương trình nào có cổng mở.

    lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
    

    Nếu điều đó cho thấy một cái gì đó mơ hồ như sshd, thì không có cách nào để biết chắc chắn đó là máy chủ X hay sự trùng hợp.

Màn hình là đối số đầu tiên cho Xorg. Bạn có thể ps sau đó grep Xorg out.

[[email protected] teste_geom]$ ps aux | grep Xorg
root      1584  5.3  1.0 156628 41708 tty1     Rs+  Jul22  22:56 /usr/bin/Xorg :0 -background none -verbose -auth /var/run/gdm/auth-for-gdm-a3kSKB/database -nolisten tcp vt1
braga     9110  0.0  0.0 109104   804 pts/1    S+   00:26   0:00 grep --color=auto Xorg

Sau đó, bạn có thể awk này thành bất kỳ định dạng nào bạn cần.

16
Vitor Py
# Show all active login shells, with displays
$ w -oush

trunc-us tty1                      23:02  -bash
trunc-us tty7     :0                4days /sbin/upstart --user
trunc-us pts/4    :0                      w -oush

# Capture the Display part
$ w -oush | grep -Eo ' :[0-9]+'

 :0
 :0

# only unique lines
$ w -oush | grep -Eo ' :[0-9]+' | uniq

 :0

# trim off the leading space
$ w -oush | grep -Eo ' :[0-9]+' | uniq | cut -d \  -f 2

[Chỉnh sửa: Tôi đã chạy một ví dụ Xnest để xem liệu điều này có bắt được nó không - nó không; nó chỉ chụp các shell đăng nhập ('w' là viết tắt của 'who'). Quay lại bảng vẽ cho tôi.] [Chỉnh sửa: Tìm thấy nó:

$ ls /tmp/.X11-unix

X0 X2

$ ls /tmp/.X11-unix | tr 'X' ':'
:0
:2

]

7
Fordi
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

sẽ thực hiện công việc bằng cách liệt kê tất cả các HIỂN THỊ hiện tại. Ngoài ra, bạn có thể thấy các màn hình được chỉ định cho một người dùng cụ thể ($ usr) với:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
4
lenroc

Bên trong /tmp thư mục cũng có thể có .X??-lock tệp có ?? cho biết số phiên.

Bạn cần xóa chúng nếu bạn muốn sử dụng lại số phiên.

Bạn có thể thấy họ bằng cách sử dụng ls -a như các tệp thông thường bắt đầu bằng . Đang ẩn.

0
user177936