Cách lấy số hiển thị tôi được chỉ định bởi X


19

Từ trang X (7)

DISPLAY NAMES
       From the user's perspective, every X server has a display name of the form:

                                  hostname:displaynumber.screennumber
[...]

displaynumber
    [...]
    To avoid confusion, each display on a machine is assigned a display
    number (beginning at 0) when the X server for that display is started.

Làm thế nào tôi có thể tìm thấy số hiển thị tôi đã được chỉ định?

Hoặc danh sách hiện đang mở màn hình và người dùng của họ?

Câu trả lời:


28

Nếu bạn biết một ID tiến trình đang chạy trong phiên của người dùng và bạn có quyền truy cập thông tin của quy trình đó, bạn có thể grep môi trường của nó cho DISPLAYbiến:

cat /proc/$pid/environ | tr '\0' '\n' | grep '^DISPLAY='

Ví dụ: để liệt kê tất cả các màn hình chính được sử dụng bởi UID của bạn trên máy tính hiện tại, hãy sử dụng:

ps -u $(id -u) -o pid= | \
    while read pid; do
        cat /proc/$pid/environ 2>/dev/null | tr '\0' '\n' | grep '^DISPLAY=:'
    done | grep -o ':[0-9]*' | sort -u

Nếu bạn chỉ đăng nhập vào một phiên X, ở trên chỉ xuất ra một dòng với nội dung tương tự :0.


Lưu ý: Nếu bạn muốn sử dụng điều này trên một dòng, bạn cần thêm một dòng ;trước done.
not2qubit

@ user1147688 cảm ơn, nhưng một nhân vật dòng mới cũng hoạt động tốt, ít nhất là trong các shell mà tôi sử dụng (Bash và Dash).
Amir

Sáng chói! Cảm ơn. Tôi đã đánh cắp cái này cho unix.stackexchange.com/a/429162/12574 với một số cải tiến;)
Gilles Quenot

11

Trong phiên X, bạn luôn có thể tham khảo DISPLAYbiến môi trường để lấy số hiển thị hiện tại ( echo $DISPLAY).

Tìm ra số hiển thị của người khác khó khăn hơn. Tôi không nghĩ có bất kỳ cách tiêu chuẩn nào để nhận thông tin ngoài việc hỏi tất cả người dùng mà họ hiển thị được kết nối với họ, vì vậy mọi nỗ lực để có được thông tin này đều yêu cầu một số loại tin tặc và sẽ không hoạt động trong mọi trường hợp.

Có một số tùy chọn được đưa ra ở những nơi khác trong SE nhưng chúng sẽ không hoạt động trên Debian Wheezy. Tuy nhiên, việc liệt kê các màn hình hiện đang hoạt động rất dễ dàng, như thể hiện trong bài tôi đã liên kết ở trên:

ps axu | grep "X " sẽ hiển thị cho bạn các quy trình X hiện đang chạy, đại loại như sau:

root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:58 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a

Tham số đầu tiên sau /usr/bin/Xlà số hiển thị có tiền tố bởi dấu hai chấm và tham số tiếp theo hiển thị cho bạn thiết bị đầu cuối ảo được gán cho phiên.

Bạn có thể nhận được câu trả lời từ việc xem danh sách quy trình:

ps axu |grep -3 "X "

root      1990  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1991  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1992  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      2359  0.0  0.0   5264  2228 ?        S    Sep15   0:00 -:1            
user_1     2378  0.0  0.0   4920  1348 ?        Ss   Sep15   0:00 /bin/sh /usr/bin/startkde
user_1     2443  0.0  0.0   3868   348 ?        Ss   Sep15   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/openbox-kde-session
--
root      7500  0.0  0.0   6460  1080 ?        Ss   Sep14   0:00 /usr/sbin/sshd
ntp       7841  0.0  0.0   5352  1760 ?        Ss   Sep14   0:17 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:111
root      7882  0.0  0.0   3964   716 ?        Ss   Sep14   0:00 /usr/bin/kdm -config /var/run/kdm/kdmrc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:59 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a
root      7906  0.0  0.0   5260  2224 ?        S    Sep14   0:00 -:0            
user_2    7925  0.0  0.0  12924  1560 ?        Ssl  Sep14   0:00 /usr/bin/lxsession -s LXDE -e LXDE
user_2    7990  0.0  0.0   3868   348 ?        Ss   Sep14   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/startlxde

Nhìn vào các dòng sau /usr/bin/X- khi phiên X bắt đầu, trình quản lý cửa sổ thường được bắt đầu với tư cách là người dùng của phiên và bạn có tên người dùng. Trong trường hợp của tôi, người dùng_1 đang sử dụng KDE và người dùng_2 đang sử dụng LXDE. Tuy nhiên, giải pháp này hoàn toàn dựa vào thực tế là hạt nhân tình cờ gán ID tiến trình mới theo trình tự tăng dần, có thể không phải luôn luôn như vậy.


Cảm ơn, tư vấn HIỂN THỊ là câu trả lời tôi nghĩ. Tuy nhiên, biến HIỂN THỊ có thể bị lỗi thời. Điều này đã xảy ra với tôi khi gắn lại vào một phiên màn hình . Nó gây ra những thứ đồ họa không hoạt động. Tôi đã giải quyết nó bằng cách tách ra, lặp lại HIỂN THỊ, gắn lại và đặt HIỂN THỊ thành giá trị mới.
ricab

Linux trưng bày môi trường của từng quá trình /proc/$pid/environ, như trong cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Xem câu trả lời của tôi cho một ví dụ sử dụng khác.
Amir

2

Câu trả lời này có một lớp lót, dựa trên who& grep

https://askubfox.com/a/230838/152287

who có thể được viết tắt là w

bạn có thể đọc thêm tại liên kết bao gồm một lớp lót để có được giá trị.

Nó hoạt động. Đây là đầu ra raspberrypi (rasbian), trong đó giá trị hiển thị nằm trong cột TỪ

tim@raspberrypi:~ $ w
 19:19:30 up  8:15,  2 users,  load average: 0.12, 0.11, 0.09
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
pi       tty7     :0               11:04    8:15m  1:15   0.89s /usr/bin/lxsess
tim      pts/0    192.168.0.29     19:17    0.00s  1.00s  0.09s w

1

https://gitorious.org/termsql/pages/Home

termsql là một công cụ tốt để trích xuất thông tin như thế.

Tìm ra số HIỂN THỊ là một trong những ví dụ:

export DISPLAY=$(ps aux | termsql "select COL11 from tbl where COL10 like '%Xorg.bin%' limit 1")

(đặt biến môi trường HIỂN THỊ thành hiển thị X đang chạy ngay bây giờ, giả sử rằng nhị phân X được gọi Xorg.bin)


1

Một biến thể nhỏ trong câu trả lời của Amir.

ps esẽ xuất ra môi trường của mỗi lệnh, không gian được phân tách để có thể truyền trực tiếp sedđể lọc ra HIỂN THỊ, đưa ra lệnh đơn giản hơn so với đọc / Proc / PID / môi trường trực tiếp. (Tuy nhiên, để đọc môi trường của những người dùng khác, bạn vẫn cần quyền root.)

Mã này sẽ xuất tên của tất cả người dùng đã đăng nhập bằng phiên X và số HIỂN THỊ của họ:

#!/bin/bash
declare -A disps usrs
usrs=()
disps=()

for i in $(users);do
    [[ $i = root ]] && continue # skip root
    usrs[$i]=1
done # unique names

for u in "${!usrs[@]}"; do
    for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
        disps[$i]=$u
    done
done

for d in "${!disps[@]}";do
    echo "User: ${disps[$d]}, Display: $d"
done
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.