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


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.