มีคำสั่งให้แสดงรายการที่เปิดอยู่ทั้งหมดบนเครื่องหรือไม่?


76

เมื่อ SSH ลงในคอมพิวเตอร์ของฉัน (ไม่ต้องถามมันเป็นวิธีแก้ปัญหา) ฉันไม่สามารถเริ่มแอปพลิเคชันแบบกราฟิกโดยไม่ต้องรัน:

export DISPLAY=:0.0

ถ้าฉันเรียกใช้สิ่งนี้ก่อนแล้วจึงเรียกใช้โปรแกรมประยุกต์แบบกราฟิก หากไม่เป็นเช่นนั้นก็ใช้ไม่ได้ไม่มีการเชื่อมต่อกับจอแสดงผล

มีคำสั่งสำหรับการแสดงรายการจอแสดงผลที่มีอยู่ทั้งหมด (เช่น: ค่าที่เป็นไปได้ทั้งหมด) บนเครื่องหรือไม่?


( DISPLAY=:0 yourapp & )วิธีทำความสะอาดเพื่อเปิดใช้งานจากขั้วคือ
— nobar

3
wเพื่อให้ได้ว่าจำนวนการแสดงผลจากสคริปต์บรรทัดคำสั่งให้ลอง ข้อมูลเพิ่มเติม: แสดงชื่อที่แสดง X ที่มีอยู่หรือไม่
— aexl

คำตอบ:


80

หากคุณต้องการให้การเชื่อมต่อ X ถูกส่งต่อผ่าน SSH คุณจะต้องเปิดใช้งานทั้งในฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ (ขึ้นอยู่กับการกระจายก็อาจจะเปิดใช้งานหรือยกเลิกโดยปริยาย.) ในฝั่งเซิร์ฟเวอร์ตรวจสอบให้แน่ใจว่าคุณมีX11Forwarding yesใน/etc/sshd_config(หรือ/etc/ssh/sshd_configหรือที่ใดก็ตามแฟ้มการกำหนดค่าเป็น) ในด้านลูกค้าผ่าน-Xตัวเลือกให้กับsshคำสั่งหรือวางในของคุณForwardX11~/.ssh/config

หากคุณทำงานssh -X localhostคุณจะเห็นว่า$DISPLAYเป็น localhost:10.0(อาจ) ตรงกันข้ามกับ:0.0ซึ่งเป็นค่าเมื่อคุณไม่ได้เชื่อมต่อผ่าน SSH ( .0อาจตัดส่วนนี้ออกไปเป็นหมายเลขหน้าจอ แต่มีหลายหน้าจอที่ไม่ค่อยได้ใช้) มีหน้าจอ X สองรูปแบบที่คุณน่าจะเคยพบ:

  • :แสดงท้องถิ่นมีอะไรก่อน
  • TCP :แสดงที่มีชื่อโฮสต์ก่อน

ด้วยssh -X localhostคุณสามารถเข้าถึงเซิร์ฟเวอร์ X ผ่านจอแสดงผลทั้งสอง แต่แอปพลิเคชันจะใช้วิธีการอื่น: :NUMBERเข้าถึงเซิร์ฟเวอร์ผ่านซ็อกเก็ตท้องถิ่นและหน่วยความจำที่แชร์ในขณะที่HOSTNAME:NUMBERเข้าถึงเซิร์ฟเวอร์ผ่าน TCP ซึ่งช้าลงและปิดการใช้งานส่วนขยายบางอย่าง

~/.Xauthorityโปรดทราบว่าคุณต้องการรูปแบบของการให้สิทธิ์ในการเข้าถึงเซิร์ฟเวอร์เอ็กซ์เรียกคุกกี้และเก็บไว้ตามปกติอยู่เบื้องหลังในไฟล์ หากคุณใช้ ssh เพื่อเข้าถึงบัญชีผู้ใช้อื่นหรือถ้าการแจกจ่ายของคุณทำให้คุกกี้อยู่ในไฟล์อื่นคุณอาจพบว่าDISPLAY=:0มันไม่ทำงานภายในเซสชัน SSH (แต่ssh -Xจะถ้าเปิดใช้งานในเซิร์ฟเวอร์คุณจะไม่เคย ต้องยุ่งXAUTHORITYเมื่อทำssh -X) หากเป็นปัญหาที่คุณจำเป็นต้องตั้งค่าXAUTHORITYตัวแปรสภาพแวดล้อมหรือได้รับคุกกี้ของผู้อื่น

ในการตอบคำถามจริงของคุณ:

  • /tmp/.X11-unixแสดงท้องถิ่นตรงกับซ็อกเก็ตใน

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • การแสดงระยะไกลสอดคล้องกับพอร์ต TCP ที่เปิดด้านบน 6000; การเข้าถึงหมายเลขที่แสดงบนเครื่อง M ทำได้โดยเชื่อมต่อกับพอร์ต TCP 6000 + N บนเครื่อง M จากเครื่อง M:

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

    (ส่วนที่เหลือของสัญลักษณ์นี้มีความสนใจด้านวิชาการเท่านั้น)

    จากเครื่องอื่นคุณสามารถใช้nmap -p 6000-6099 host_nameในการสอบสวนพอร์ต TCP ที่เปิดอยู่ในช่วงปกติ ทุกวันนี้มีน้อยมากที่มีเซิร์ฟเวอร์ X ที่ฟังบนซ็อกเก็ต TCP โดยเฉพาะนอกอินเตอร์เฟสลูปแบ็ค

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

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

    หากนั่นแสดงให้เห็นสิ่งที่ไม่ชัดเจนเช่นsshdไม่มีวิธีที่จะรู้ว่ามันเป็นเซิร์ฟเวอร์ X หรือเรื่องบังเอิญ


15

Xorgแสดงเป็นอาร์กิวเมนต์แรก psจากนั้นคุณสามารถgrep Xorgout

[braga@coleman 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

คุณสามารถใช้awkรูปแบบใดก็ได้ที่คุณต้องการ


10
นี้ไม่ได้ตรวจสอบการแสดงที่สร้างขึ้นโดยเซิร์ฟเวอร์อื่นนอกเหนือ Xorg เช่นXvnc
— cjm

5
ps aux |grep Xทำงานได้ดีขึ้นสำหรับฉัน
— nobar

6
wแสดงให้ทุกคนที่เข้าสู่ระบบและแสดงผล
— Plenus Franckly

2
โปรดทราบว่าอาร์กิวเมนต์ของ Xorg นั้น (อย่างน้อยตอนนี้ในปี 2016) เป็นทางเลือกและ (อย่างน้อยใน Fedora) มักจะหายไปดังนั้นวิธีนี้จึงใช้ไม่ได้อีกต่อไป
— BRPocock

หากด้วยเหตุผลบางอย่างเพียงแค่ตั้งค่า var สภาพแวดล้อมจะไม่ทำงานเสมอ ... ลองเตรียมคำสั่งDISPLAY=:0 netsurf "https://medium.com/"... หรือใช้export DISPLAY=:0เพื่อแชร์ var กับกระบวนการไม่ใช่แค่เชลล์
— Ray Foss

7
# 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

[แก้ไข: ฉันใช้งานอินสแตนซ์ Xnest เพื่อดูว่าจะจับได้หรือไม่ - ไม่ใช่; มันจับเฉพาะเชลล์ล็อกอินเท่านั้น ('w' สั้นสำหรับ 'who') กลับไปที่กระดานวาดรูปสำหรับฉัน] [แก้ไข: พบ:

$ ls /tmp/.X11-unix

X0 X2

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

]


1
นั่นคือ ... แปลก ... ฉันสงสัยว่าคำอธิบายมีอะไร
— Fordi

(เกี่ยวกับ GDM ที่ทำงานบนจอแสดงผล 1024 สำหรับฉัน) ฉันไม่สามารถทำซ้ำได้อีกเป็นครั้งที่สอง ในขณะที่ฉันลอง xrdp, ส่งต่อหน้าต่าง X11 และลูกค้า VNC บางราย ดูเหมือนว่าในการติดตั้งทั่วไป GDM จะทำงานบน X0 ... หรือ X1 หากคุณกดปุ่ม "เข้าสู่ระบบในฐานะผู้ใช้รายอื่น" บนหน้าจอล็อค วิธีที่สองของคุณใช้ได้กับฉันใน Fedora 23
— Ray Foss

ฉันพบบางอย่างบนจอแสดงผล 1024 โดยใช้คำสั่งของคุณ แต่ฉันไม่เห็นอะไรทำงานอยู่ที่นั่น ... โดยใช้ps xeww | grep DISPLAY=:1024ตอนนี้ที่แปลก ฉันกำลังเรียกใช้ chrome-remote-desktop บนจอแสดงผล 20 เช่นกัน
— เรย์ฟอสส์

wไม่ทำงานหากไม่มีแอปพลิเคชันทำงานบนเซิร์ฟเวอร์ x (รวมถึงไม่มีตัวจัดการหน้าต่างและไม่มีเดสก์ท็อป) แต่ได้ls /tmp/.X11-unixผล
— 12431234123412341234123

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

จะทำงานโดยการแสดงรายการ DISPLAY ปัจจุบันทั้งหมด นอกจากนี้คุณยังสามารถดูหน้าจอที่กำหนดไว้สำหรับผู้ใช้เฉพาะ ($ usr) ด้วย:

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

อันที่สองหมายความว่าจะเป็นps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -uอย่างไร
— Alexx Roche

0

ใน/tmpโฟลเดอร์ยังสามารถมี.X??-lockไฟล์พร้อม??ระบุหมายเลขเซสชัน

คุณต้องลบสิ่งเหล่านี้หากคุณต้องการใช้หมายเลขเซสชันอีกครั้ง

คุณสามารถเห็นพวกเขาใช้ls -aเป็นไฟล์ปกติเริ่มต้นด้วยการ.ถูกซ่อนอยู่


เหล่านี้คือเซสชันการแสดงผล?
— phk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.