วิธีรับหมายเลขแสดงที่ฉันได้รับมอบหมายจาก X


20

จากหน้าคน 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.

ฉันจะค้นหาหมายเลขแสดงที่ฉันได้รับมอบหมายได้อย่างไร

หรือรายการแสดงเปิดอยู่ในปัจจุบันและผู้ใช้ของพวกเขา?

คำตอบ:


29

หากคุณรู้ว่ามี ID กระบวนการหนึ่งรายการที่ทำงานอยู่ในเซสชันของผู้ใช้และคุณได้รับอนุญาตให้เข้าถึงข้อมูลของกระบวนการนั้นคุณสามารถ grep สภาพแวดล้อมของDISPLAYตัวแปรนั้นได้:

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

เป็นตัวอย่างในการแสดงรายการการแสดงผลหลักทั้งหมดที่ใช้โดย UID ของคุณบนคอมพิวเตอร์ปัจจุบันให้ใช้:

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

หากคุณเข้าสู่ระบบเพียงครั้งเดียวเท่านั้น X เซสชันด้านบนจะแสดงผลลัพธ์เพียงบรรทัดเดียวที่มีลักษณะ:0ดังนี้


หมายเหตุ: หากคุณอยากจะลองใช้วิธีนี้ในบรรทัดเดียวที่คุณต้องเพิ่มก่อน; done
not2qubit

@ user1147688 ขอบคุณ แต่ตัวละครขึ้นบรรทัดใหม่ทำงานได้ดีเช่นกันอย่างน้อยในเชลล์ที่ฉันใช้ (Bash และ Dash)
Amir

สุกใส! ขอบคุณ ฉันขโมยนี้unix.stackexchange.com/a/429162/12574กับการปรับปรุงบาง;)
Gilles Quenot

11

ในเซสชัน X คุณสามารถดูDISPLAYตัวแปรสภาพแวดล้อมเพื่อรับหมายเลขการแสดงผลปัจจุบัน ( echo $DISPLAY)

การค้นหาหมายเลขที่แสดงของผู้อื่นนั้นยากกว่า ฉันไม่คิดว่าจะมีวิธีมาตรฐานในการรับข้อมูลนอกเหนือจากการถามผู้ใช้ทั้งหมดที่แสดงการเชื่อมต่อดังนั้นความพยายามใด ๆ ที่จะได้รับข้อมูลนี้ต้องมีการแฮ็กข้อมูลบางประเภทและจะไม่ทำงานในทุกกรณี

มีตัวเลือกบางอย่างให้ในที่อื่น ๆ ใน SEแต่พวกเขาจะไม่ทำงานกับ Debian Wheezy อย่างไรก็ตามการแสดงรายการที่ใช้งานอยู่ในปัจจุบันนั้นเป็นเรื่องง่ายดังที่แสดงในโพสต์ที่ฉันลิงก์ด้านบน:

ps axu | grep "X " จะแสดงกระบวนการ X ที่กำลังทำงานอยู่ให้คุณดังนี้:

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

พารามิเตอร์แรกหลังจากนั้น/usr/bin/Xคือหมายเลขที่แสดงนำหน้าด้วยโคลอนและพารามิเตอร์ถัดไปจะแสดงเทอร์มินัลเสมือนที่กำหนดให้กับเซสชัน

คุณอาจได้รับคำตอบจากการดูรายการกระบวนการแม้ว่า:

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

ดูบรรทัดหลังจาก/usr/bin/X- เมื่อเซสชัน X เริ่มขึ้นตัวจัดการหน้าต่างจะเริ่มโดยทั่วไปเมื่อผู้ใช้เป็นสมาชิกของเซสชันและคุณจะได้รับชื่อผู้ใช้ ในกรณีของฉัน user_1 กำลังใช้ KDE และ user_2 กำลังใช้ LXDE อย่างไรก็ตามวิธีนี้ขึ้นอยู่กับข้อเท็จจริงที่ว่าเคอร์เนลเกิดขึ้นเพื่อกำหนด ID กระบวนการใหม่ในลำดับจากน้อยไปมากซึ่งอาจไม่ได้เป็นกรณีเสมอไป


ขอบคุณการให้คำปรึกษา DISPLAY คือคำตอบที่ฉันคิด อย่างไรก็ตามตัวแปร DISPLAY อาจล้าสมัย เรื่องนี้เกิดขึ้นกับฉันเมื่อติดตั้งซ้ำกับเซสชันหน้าจอ มันทำให้สิ่งกราฟิกไม่ทำงาน ฉันแก้ไขมันด้วยการถอดสะท้อนการแสดงผลติดตั้งใหม่และตั้งค่า DISPLAY ให้เป็นค่าใหม่
ricab

ลินุกซ์ exposes สภาพแวดล้อมของแต่ละกระบวนการภายใต้เช่นเดียวกับใน/proc/$pid/environ cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='ดูคำตอบของฉันสำหรับตัวอย่างการใช้งานอื่น
อาเมียร์

2

คำตอบนี้มีหนึ่งซับตามwho& grep

/ubuntu//a/230838/152287

who สามารถย่อเป็น w

คุณสามารถอ่านเพิ่มเติมได้ที่ลิงค์รวมถึงสายการบินเดียวเพื่อรับค่า

มันได้ผล. นี่คือเอาต์พุต raspberrypi (rasbian) ซึ่งค่าที่แสดงอยู่ในคอลัมน์ FROM

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 เป็นเครื่องมือที่ดีสำหรับการดึงข้อมูลเช่นนั้น

การค้นหาหมายเลข DISPLAY เป็นหนึ่งในตัวอย่าง:

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

(ตั้งค่าตัวแปรสภาพแวดล้อม DISPLAY เป็นสิ่งที่ display X กำลังทำงานอยู่ในขณะนี้โดยสมมติว่ามีการเรียก X binary Xorg.bin)


1

ความแตกต่างเล็กน้อยในคำตอบของ Amir

ps eจะเอาท์พุทสภาพแวดล้อมของคำสั่งแต่ละช่องว่างคั่นดังนั้นมันสามารถส่งผ่านโดยตรงไปsedยังการกรอง DISPLAY ให้คำสั่งที่ง่ายกว่าการอ่าน / proc / PID / environ โดยตรง (หากต้องการอ่านสภาพแวดล้อมของผู้ใช้รายอื่นคุณยังต้องได้รับอนุญาตรูท)

รหัสนี้จะแสดงชื่อของผู้ใช้ที่เข้าสู่ระบบด้วยเซสชัน X และหมายเลข DISPLAY:

#!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.