(ดัดแปลงจากLinux: wmctrl ไม่สามารถเปิดการแสดงผลได้เมื่อเซสชันเริ่มต้นผ่านหน้าจอ ssh + )
การแสดงผลและหน่วยงาน
โปรแกรม X ต้องการข้อมูลสองชิ้นเพื่อเชื่อมต่อกับจอแสดงผล X
มันต้องอยู่ของจอแสดงผลซึ่งโดยปกติ:0
เมื่อคุณเข้าสู่ระบบในท้องถิ่นหรือ:10
, :11
ฯลฯ เมื่อคุณเข้าสู่ระบบจากระยะไกล ( แต่จำนวนจะเปลี่ยนไปขึ้นอยู่กับจำนวนการเชื่อมต่อ X มีการใช้งาน) ปกติแล้วที่อยู่ของจอแสดงผลจะระบุไว้ในDISPLAY
ตัวแปรสภาพแวดล้อม
มันต้องการรหัสผ่านสำหรับการแสดงผล รหัสผ่าน X จอแสดงผลจะเรียกว่าคุกกี้มายากล ไม่ได้ระบุคุกกี้เวทย์โดยตรง: พวกมันจะถูกเก็บไว้ในไฟล์ X Authority เสมอซึ่งเป็นชุดของเร็กคอร์ดของฟอร์ม“ display :42
มีคุกกี้123456
” โดยปกติไฟล์สิทธิ X จะระบุไว้ในXAUTHORITY
ตัวแปรสภาพแวดล้อม หากไม่มีการตั้งค่าโปรแกรมใช้$XAUTHORITY
~/.Xauthority
คุณกำลังพยายามที่จะทำงานกับหน้าต่างที่ปรากฏบนเดสก์ท็อป :0
หากคุณเป็นเพียงคนเดียวที่ใช้เครื่องคอมพิวเตอร์ของคุณก็มีโอกาสมากที่ชื่อจอแสดงผลเป็น การค้นหาตำแหน่งของไฟล์ X Authority นั้นยากกว่าเพราะด้วย gdm ตามที่ตั้งไว้ภายใต้ Debian squeeze หรือ Ubuntu 10.04 มันอยู่ในไฟล์ที่มีชื่อที่สร้างแบบสุ่ม (คุณไม่มีปัญหามาก่อนเพราะ gdm รุ่นก่อนหน้าใช้การตั้งค่าเริ่มต้นเช่นคุกกี้ที่เก็บไว้~/.Xauthority
)
รับค่าของตัวแปร
ต่อไปนี้เป็นวิธีการรับค่าDISPLAY
และXAUTHORITY
:
คุณสามารถเริ่มเซสชันหน้าจอจากเดสก์ท็อปของคุณอย่างเป็นระบบโดยอัตโนมัติในสคริปต์การเข้าสู่ระบบของคุณ (จาก~/.profile
แต่ทำได้เฉพาะเมื่อเข้าสู่ระบบภายใต้ X: ทดสอบว่าDISPLAY
ตั้งค่าเป็นค่าเริ่มต้นด้วย:
(ซึ่งควรครอบคลุมทุกกรณี พบ)) ใน~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
จากนั้นในเซสชัน ssh:
screen -d -r local
คุณสามารถบันทึกค่าDISPLAY
และXAUTHORITY
ในไฟล์และเรียกคืนค่าต่างๆ ใน~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
ในเซสชัน ssh:
. ~/.local-display-setup.sh
screen
คุณสามารถตรวจสอบค่าของDISPLAY
และXAUTHORITY
จากกระบวนการทำงาน นี่เป็นเรื่องยากที่จะทำให้เป็นอัตโนมัติ คุณต้องคิด PID ของกระบวนการที่เชื่อมต่อกับจอแสดงผลที่คุณต้องการทำงานจากนั้นรับตัวแปรสภาพแวดล้อมจาก/proc/$pid/environ
( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹)
คัดลอกคุกกี้
อีกวิธีหนึ่ง (ตามคำแนะนำโดยArrowmaster ) คือการไม่พยายามที่จะได้รับค่าของ$XAUTHORITY
ในเซสชั่น SSH ~/.Xauthority
แต่แทนที่จะเพื่อให้เซสชั่นเอ็กซ์คัดลอกคุกกี้ของมันเข้าไป ~/.Xauthority
ตั้งแต่คุกกี้จะถูกสร้างขึ้นในแต่ละครั้งที่คุณเข้าสู่ระบบก็ไม่ได้เป็นปัญหาถ้าคุณเก็บค่าค้างใน
อาจมีปัญหาด้านความปลอดภัยหากโฮมไดเรกทอรีของคุณสามารถเข้าถึงได้ผ่าน NFS หรือระบบไฟล์เครือข่ายอื่นที่อนุญาตให้ผู้ดูแลระบบระยะไกลสามารถดูเนื้อหาได้ พวกเขายังคงต้องเชื่อมต่อกับเครื่องของคุณยกเว้นว่าคุณได้เปิดใช้งานการเชื่อมต่อ X TCP (Debian จะปิดใช้งานตามค่าเริ่มต้น) ดังนั้นสำหรับคนส่วนใหญ่สิ่งนี้อาจใช้ไม่ได้ (ไม่มี NFS) หรือไม่มีปัญหา (ไม่มีการเชื่อมต่อ X TCP)
หากต้องการคัดลอกคุกกี้เมื่อคุณเข้าสู่เซสชัน X บนเดสก์ท็อปของคุณให้เพิ่มบรรทัดต่อไปนี้ลงใน~/.xprofile
หรือ~/.profile
(หรือสคริปต์อื่นที่อ่านเมื่อคุณลงชื่อเข้าใช้):
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
¹ ในหลักการนี้ขาดเหมาะสม quoting แต่ในกรณีนี้โดยเฉพาะ$DISPLAY
และ$XAUTHORITY
จะไม่ประกอบด้วย metacharacter เปลือกใด ๆ