XDG_RUNTIME_DIR คืออะไร


14

ขณะที่ฉันพยายามเปิดEvinceจากบรรทัดคำสั่งมันทำให้ฉันมีข้อผิดพลาด

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

วิธีแก้ปัญหานี้


1
บอกเราเพิ่มเติมเกี่ยวกับระบบปฏิบัติการของคุณ
DK Bose

คำตอบ:


30

สิ่งแรกสิ่งแรก: XDG_RUNTIME_DIR

หากต้องการตอบคำถามแรกของคุณ"XDG_RUNTIME_DIR คืออะไร" มันเป็นตัวแปรสภาพแวดล้อมที่ตั้งค่าโดยอัตโนมัติเมื่อคุณเข้าสู่ระบบมันบอกโปรแกรมใด ๆ ที่คุณเรียกใช้ที่จะหาไดเรกทอรีเฉพาะผู้ใช้ที่มันสามารถเก็บไฟล์ชั่วคราวขนาดเล็ก โปรดทราบว่าXDG_RUNTIME_DIRถูกตั้งค่าโดยpam_systemd(8)ดังนั้นจึงไม่เกี่ยวข้องกับX (การเรียกใช้โปรแกรมแบบกราฟิก) ซึ่งเป็นปัญหาที่คุณดูเหมือนจะมี

วิธีแก้ปัญหา

คำถามที่สองของคุณ"วิธีแก้ไขปัญหานี้" เป็นคนดีมาก นั่นหมายความว่าคุณกำลังสนใจในการไม่เพียง แต่สิ่งที่แก้ไข แต่ยังวิธีการที่จะคิดออกด้วยตัวคุณเอง ในการเริ่มต้นให้ดูข้อความข้อผิดพลาดแรกก่อน โดยเฉพาะอย่างยิ่งการค้นหาNo protocol specifiedหรือWARNING **: Could not open X displayควรแสดงให้คุณเห็นว่าปัญหาเกิดขึ้นกับX (หรือที่เรียกว่าThe X Windowing System ) ซึ่งเป็นวิธีแสดงโปรแกรมกราฟิกบนหน้าจอของคุณ รู้ว่าควรตั้งคำถามการแก้ไขปัญหาในใจของคุณ

X DISPLAY

คำถามต่อไปของคุณอาจเป็น"X display"ที่ไม่สามารถเปิดได้ "display" คือที่อยู่สำหรับหน้าจอของคุณ [*]โปรแกรมใด ๆ ที่ต้องการเขียนไปยังหน้าจอของคุณจะต้องทราบที่อยู่ คุณสามารถดูว่าจอแสดงผล X ของคุณคืออะไรโดยตรวจสอบตัวแปรสภาพแวดล้อม DISPLAY:

echo $DISPLAY

และคุณสามารถตรวจสอบสิ่งที่sudoคิดว่าการแสดงผลของคุณคือโดยพิมพ์:

sudo -s
echo $DISPLAY
exit

หากไม่แสดงสิ่งใดแสดงว่าเป็นปัญหา (ดูการแก้ไขด้านล่าง)

ดิสเพลย์

แต่จะเกิดอะไรขึ้นถ้านั่นไม่ใช่ปัญหาและการDISPLAYตั้งค่าถูกต้องsudoหรือไม่ จากนั้นคุณอาจสงสัยว่าXมีสิทธิ์บางอย่างที่ป้องกันผู้ใช้รายอื่นจากการเขียนบนจอแสดงผลของฉันหรือไม่? หากคุณคิดว่าคุณต้องการจะขวา, Xมีสองวิธีการอนุญาตหลักและxauth xhostสิ่งที่ใช้บ่อยที่สุดในวันนี้คือxauth(1)ซึ่งใช้XAUTHORITYตัวแปรสภาพแวดล้อม ตรวจสอบอีกครั้งว่ามีการตั้งค่าอย่างถูกต้องในsudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

หากXAUTHORITYชี้ไปที่ไฟล์ในโฮมไดเร็กตอรี่ของคุณ แต่มันว่างเปล่าเมื่อคุณเรียกใช้แสดงsudoว่าเป็นปัญหา

การแก้ไข: บันทึกตัวแปรสภาพแวดล้อม

ดังนั้นการแก้ไขคืออะไร? หากตัวแปรสภาพแวดล้อมDISPLAYหรือXAUTHORITYตัวแปรสภาพแวดล้อมไม่ได้รับการบันทึกsudoคุณสามารถบอกsudo(8)เพื่อรักษาสภาพแวดล้อมโดยใช้-Eตัวเลือกดังนี้:

sudo -E evince

วิธีที่ดีกว่า: env_keep

คุณอาจรวมทั้งขอให้รอถ้า-Eทำให้ทุกอย่างทำงานได้อย่างน่าอัศจรรย์แล้วทำไมไม่ได้เริ่มต้นสำหรับsudo? คำตอบคือมันอาจเป็นอันตรายต่อความปลอดภัย ตัวแปรสภาพแวดล้อมส่งผลกระทบต่อการทำงานของโปรแกรมและคุณไม่ต้องการให้ส่งออกทั้งหมดจากบัญชีผู้ใช้ไปยังรูท "ถูกต้อง" วิธีการทำก็คือการเพิ่มบรรทัดDefaults env_keep += "DISPLAY XAUTHORITY"ไปsudoers(5)ไฟล์โดยใช้(8)visudo คุณสามารถตรวจสอบว่าตัวแปรสภาพแวดล้อม sudo รักษาไว้โดยการเรียกใช้:

sudo sudo -V

(ใช่คุณพิมพ์sudoสองครั้ง) ฉันแนะนำให้วางสายไม่ได้อยู่ในไฟล์ sudoers เริ่มต้น ( /etc/sudoers) แต่ในไฟล์ภายในเครื่องที่จะไม่ถูกเขียนทับเมื่อคุณอัพเกรดระบบ คุณสามารถทำเช่นนั้น:

sudo visudo -f /etc/sudoers.d/local 

แต่เดี๋ยวก่อนจะเกิดอะไรขึ้นถ้าไม่มีการทำงานใด ๆ ข้างต้น

ฉันคิดว่านี่เป็นคำตอบที่ค่อนข้างละเอียด แต่ถ้าคุณยังมีปัญหาอยู่มีอีกอย่างที่ฉันอยากแนะนำ คุณสามารถใช้xhost(1)เพื่อให้สิทธิ์การเข้าถึงแก่ผู้ใช้เฉพาะบนโฮสต์ท้องถิ่น (เครื่องของคุณ) เช่นนั้น

xhost si:localuser:root

ในกรณีนี้เรากำลังระบุrootว่าเป็นชื่อผู้ใช้เนื่องจากเป็นบัญชีที่ใช้sudoงานโปรแกรมเป็น


[*] : ถาม:ฉันมีหน้าจอเดียวแล้วทำไมหน้าจอ X ถึงต้องการ "ที่อยู่"? ตอบ:เป็นเพราะXสามารถทำงานได้ไม่เพียง แต่ในเครื่องของคุณ แต่ผ่านทางอินเทอร์เน็ต ด้วยXคุณสามารถเรียกใช้โปรแกรมบนเครื่องของคุณที่แสดงบนโฮสต์อินเทอร์เน็ตอื่นและโปรแกรมบนโฮสต์อื่นที่ปรากฏบนหน้าจอของคุณ (สมมติว่าคุณให้สิทธิ์แก่พวกเขา)


ขอบคุณสำหรับคำตอบที่บรรจง ฉันแน่ใจว่ามีคำตอบของคุณอย่างน้อยสำหรับผู้ใช้ทุกคน (สำหรับฉัน: วิธีการให้สิทธิ์การเข้าถึง X ให้กับผู้ใช้ที่เฉพาะเจาะจงซึ่งดีกว่าการxhost +อนุญาตให้เข้าถึงแบบสากล)
drumfire

3

XDG_RUNTIME_DIRเป็นตัวแปรสภาพแวดล้อมที่ตั้งค่าในบริบท X Windows ของคุณเพื่อให้โปรแกรมสามารถค้นหาสิ่งต่าง ๆ ได้ คุณ ( neo) ได้ตั้งค่าบริบทกราฟิก

โดยพยายามที่จะใช้evinceเป็นrootคุณได้ป้อนเงื่อนไขที่ผู้ใช้ ( root) พยายามที่จะเข้าถึงผู้ใช้อื่น ( neo) จอแสดงผล นี่ถือเป็นสิ่งที่ไม่ดี

หากคุณตัดสินใจที่คุณต้องเรียกใช้โปรแกรมแก้ไขกราฟิกเป็นrootอ่านและทำให้การใช้งานของman gksudo gksudo


ความคิดเห็นที่น่าสนใจ คุณรู้หรือไม่ว่าฉันจะทำสิ่งนี้ได้อย่างไร journalctl -b -p err | wl-copyมันรายงานFailed to connect to a Wayland serverที่สมเหตุสมผล แต่ฟังดูเป็นใบ้จาก User POV
mh-cbon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.