(ดัดแปลงจาก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 เปลือกใด ๆ