เหตุใดฉันจึงไม่สามารถเรียกใช้แอป GUI จาก "รูท": "ไม่ได้ระบุโปรโตคอล"


38

ฉันติดตั้งเดเบียนลงบนเครื่องเมื่อคืนนี้ ตอนนี้ฉันไม่เข้าใจว่าทำไมฉันไม่สามารถเรียกใช้แอพ GUI จากเทอร์มินัลเมื่อทำงานเป็นรูท

ตัวอย่างเช่น:

sudo -i
glxgears

สร้างเอาต์พุตต่อไปนี้:

No protocol specified
Error: couldn't open display :0

แต่เมื่อฉันเปิดเทอร์มินัลครั้งแรกฉันสามารถเรียกใช้glxgearsจากบัญชีผู้ใช้ หลังจากที่ฉันทำอย่างsudo -iนั้นปัญหาก็จะหมดไป สิ่งนี้เกิดขึ้นสำหรับแอพ GUI ใด ๆ ที่ฉันพยายามเรียกใช้ ฉันคิดว่ามันอาจเกี่ยวข้องกับ X11 แต่ฉันไม่แน่ใจ


1
stackoverflow.com/a/20612084 สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

เกี่ยวกับ Wayland เพียงในกรณีที่: Arch วิกิพีเดีย , "sudo กับแอพพลิเคกราฟิกไม่ทำงานบน Wayland"
Alexey

คำตอบ:


39

การเข้าถึงเซิร์ฟเวอร์ X ต้องการสองสิ่ง:

  • $DISPLAYตัวแปรชี้ไปที่การแสดงผลที่ถูกต้อง (ปกติ:0)
  • ข้อมูลการรับรองความถูกต้องที่เหมาะสม

ข้อมูลการรับรองความถูกต้องสามารถระบุได้อย่างชัดเจนผ่านทาง$XAUTHORITYและค่าเริ่มต้นเป็น~/.Xauthorityอย่างอื่น

หาก$DISPLAYและ$XAUTHORITYถูกตั้งค่าสำหรับผู้ใช้ของคุณsudoจะตั้งค่าสำหรับเชลล์ใหม่ด้วยและทุกอย่างจะทำงานได้ดี

หากไม่ได้ตั้งค่าอาจเป็นค่าเริ่มต้นที่ผิดและคุณไม่สามารถเริ่มและแอปพลิเคชัน X ได้

ในเดเบียน$XAUTHORITYมักจะไม่ได้ตั้งค่าไว้อย่างชัดเจน เพียงเพิ่ม

export XAUTHORITY=~/.Xauthority

เพื่อของคุณ.bashrcหรือพูดอย่างชัดเจนXAUTHORITY=~/.Xauthority sudo ...และทุกอย่างควรทำงาน

คุณยังสามารถใช้xauth listเพื่อตรวจสอบว่ามีข้อมูลการตรวจสอบความถูกต้องที่เหมาะสมหรือไม่


1
xauth infoแสดงพา ธ ไปยังไฟล์สิทธิใช้งาน
Tomas Tomecek

1
xhost +แก้ไขปัญหาของฉัน
danger89

3
โปรดทราบว่าxhost +จะปิดการใช้งานการรับรองความถูกต้องอย่างสมบูรณ์และอนุญาตให้ทุกคนเข้าถึงแอปพลิเคชันทั้งหมดบนหน้าจอของคุณ ...
michas

1
สำหรับเดเบียนฉันจะพิมพ์ XAUTHORITY ที่ส่งออกเป็นรูตหรือไม่ เพราะมันไม่ทำงานใน deb10? ฉันเข้าสู่ระบบด้วย sudo su
marinara

@marinara ใช้แทนsudo -i sudo su -
Michas

23

ฉันมีคำถามเดียวกันกับคุณ แต่สำหรับผู้ใช้ปกติ สมมติว่าฉันต้องการเริ่ม Firefox โดยใช้บัญชีผู้ใช้ foo ฉันเข้าสู่ระบบในฐานะบาร์:

[bar@localhost ~]$ sudo -u foo -H firefox

น่าเศร้าที่คำสั่งนั้นล้มเหลวโดยมีข้อผิดพลาดเหมือนกับในคำถาม (เช่นไม่มีโปรโตคอลที่ระบุและไม่สามารถเปิดจอแสดงผลได้)

โซลูชันของฉันคือเพียงเพิ่ม foo ผู้ใช้ลงในรายการการเข้าถึงที่ได้รับอนุญาตไปยังเซิร์ฟเวอร์ X

xhost si:localuser:foo

และนั่นก็คือฉันสามารถเปิด Firefox (และแอพพลิเคชั่น X อื่น ๆ ) โดยใช้sudoและผู้ใช้งาน foo

พื้นหลัง : บน X Window จะมีสถาปัตยกรรมไคลเอนต์ / เซิร์ฟเวอร์ เมื่อคุณเรียกใช้แอปพลิเคชันคุณจะต้องขอการอนุญาตจาก X server เพื่อแสดง ตามค่าเริ่มต้นเมื่อคุณเปิดเซสชัน (คุณเข้าสู่ระบบแบบกราฟิก) คุณ (ผู้ใช้ของคุณ) จะได้รับอนุญาตให้สื่อสารกับเซิร์ฟเวอร์และแอปพลิเคชันการแสดงผลอย่างชัดเจน ผู้ใช้รายอื่นไม่มีสิทธิ์นี้นอกจากคุณจะระบุ xhostเป็นเครื่องมือในการจัดการรายการสิทธิ์ siแสดงให้เห็นว่ากฎเป็นฝั่งเซิร์ฟเวอร์และจะอนุญาตให้ผู้ใช้ท้องถิ่นfooเพื่อการใช้งานจอแสดงผล X Window มีประสิทธิภาพมากในเรื่องนี้และคุณสามารถแสดงแอปพลิเคชันระยะไกลในพื้นที่ได้ด้วยการเล่นกับDISPLAYตัวแปรสภาพแวดล้อมและxhost(แต่ไม่ จำกัด เฉพาะพวกมัน) ในสมัยก่อนเมื่อมีคนพิมพ์xhost + และอนุญาตให้ทุกคนใช้เซสชั่น X ของพวกเขาโดยปริยายมันเป็นไปได้ที่จะแสดงแอปพลิเคชันบนหน้าจอของพวกเขาสำหรับการเล่นแผลง ๆ ;-) ไม่มากในปัจจุบันเนื่องจากผู้คนใช้งานน้อยลง 10 ปีที่ผ่านมา)

PS: ฉันทำสิ่งนี้เพื่อเปิด Firefox ในรูปแบบ "คุก" (เพื่อหลีกเลี่ยงช่องโหว่เช่นสำหรับ pdf.jsในอนาคต) แต่ฉันพบว่าการโทร Firefox ผ่าน sudo จะไม่อนุญาตให้เข้าถึงเสียงหรือฮาร์ดแวร์วิดีโอ แต่มีหนึ่งคนที่แต่งตัวประหลาดที่ชัดเจนอธิบายวิธีการเร่งฮาร์ดแวร์วิดีโอเปิดใช้งานและเสียงเมื่อโทร Firefox ผ่าน sudo YMMV พร้อมคำแนะนำเหล่านี้เช่นฉันยังคงได้รับอนุญาตปฏิเสธด้วยเสียง แต่วิดีโอทำได้ดี (ทดสอบใน Fedora 22 ด้วย SELinux ON)


1
ในกรณีของผมfooก็rootคือผมต้องวิ่งxhost si:localuser:rootบน Ubuntu 17.10
Karl Richter

คุณจะเพิ่มxhost si:localhost<user>คำสั่งที่ไหน? หากไม่มีผู้ใช้เข้าสู่ระบบแสดงว่าไม่มีใครมี X server เพื่อให้สิทธิ์
cbcoutinho

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

@Huygens ฉันมีเวิร์กสเตชันสำหรับจำลองของเหลวที่มาพร้อมกับ GPU ฉันสร้างภาพข้อมูลด้วยParaViewโปรแกรมที่สร้างขึ้นvtkโดยปกติจะอยู่บนเวิร์กสเตชันของตัวเอง ParaViewยังมีรูปแบบการเรนเดอร์ไคลเอนต์ / เซิร์ฟเวอร์ที่ปลอดภัยผ่าน ssh ซึ่งฉันต้องการใช้ประโยชน์จากรีโมตแทนการใช้ VNC หากไม่มีการเข้าสู่เวิร์กสเตชันและดำเนินการxhostฉันไม่สามารถใช้ GPU ได้ นั่นหมายความว่าฉันไม่สามารถรีบูตเครื่องจากระยะไกลและยังสามารถเข้าถึง GPU ได้
cbcoutinho

1
@cbcoutinho X Window เป็นสถาปัตยกรรมเซิร์ฟเวอร์ไคลเอ็นต์ เมื่อคุณเชื่อมต่อผ่าน ssh เวิร์กสเตชันในพื้นที่ของคุณจะกลายเป็นไคลเอนต์ X Window คุณสามารถใช้ xhost กับโปรโตคอลที่ไม่ปลอดภัยเช่น rlogin แต่ไม่ใช่ ssh คุณต้องสั่งให้ ssh ทำเพื่อคุณ อาจใช้การตั้งค่าสถานะ-Xหรือ (ดีกว่า) -Yบน ssh มันจะทำการเปลี่ยนเส้นทางที่เหมาะสม แน่นอนว่าคุณต้องใช้ C เซิร์ฟเวอร์ท้องถิ่น อย่างไรก็ตามด้วย GPU และ OpenGL ฉันไม่แน่ใจว่าจะมีการเรนเดอร์ / การคำนวณเกิดขึ้นที่ฝั่งไคลเอ็นต์ไม่ใช่เซิร์ฟเวอร์ตัวใดตัวหนึ่ง อาจเป็นเรื่องยุ่งยาก
Huygens

10

คุณสามารถ

ระบุจอแสดงผลที่จะใช้ในบรรทัดคำสั่งโดยการเพิ่ม -display :0.0

หรือ

ตั้งค่าตัวแปรสภาพแวดล้อมในสคริปต์การเข้าสู่ระบบของรูท (.bashrc, .profile, .bash_profile ... หนึ่ง)

export DISPLAY=:0.0

คุณสามารถตรวจสอบว่ามีการตั้งค่าหรือไม่

$ env |grep DISPLAY
DISPLAY=:0.0

ในการเปิดจอแสดงผลสำหรับผู้ใช้ทั้งหมดจากโฮสต์ทั้งหมดในฐานะผู้ใช้ปกติคุณสามารถทำได้ด้วย:

xhost +


1
xhost + ทำงานเป็นมาตรการชั่วคราวก่อนเข้าร่วมในฐานะ sudo
Octopus

1
xhost +ทำงานให้ฉันด้วยเช่นกันเฉพาะที่พวกเขาลืมที่จะพูดถึงว่าเราควรเรียกใช้จากเทอร์มินัลผู้ใช้ที่ได้รับอนุญาตไม่ใช่จากเทอร์มินัลด้านsudo suล่าง
nyxee

1
การทำงานที่สมบูรณ์แบบเหมือนบูม
Adiii

3

ระบุว่าคุณอยู่ใน Debian โซลูชันที่ง่ายและได้รับการสนับสนุนคือการจัดการsudoเพื่อคัดลอกข้อมูลรับรอง X11 ของคุณ pam_xauthรวมอยู่ในlibpam-modulesแพ็คเกจเพื่อจุดประสงค์นี้อย่างแน่นอน เพื่อใช้งานคุณเพียงแค่เพิ่ม

session  optional  pam_xauth.so

ไปยัง/etc/pam.d/sudoไฟล์ของคุณ คุณสามารถเลือกที่จะเพิ่มลงไปsuได้เช่นกัน สำหรับข้อมูลเต็มรูปแบบให้ปรึกษาpam_xauthหน้าคนแน่นอน


2

อะไรช่วยฉัน:

  1. คุณสามารถxauth generate :0 . trustedอยู่userด้านข้างซึ่งจะสร้างใหม่MIT-MAGIC-COOKIE-1
  2. ตรวจสอบคีย์ที่สร้างขึ้นใหม่พร้อมกับรูตxauth list' asผู้ใช้ตัวแปร xAuthority` ชี้ไปที่ไฟล์เดียวกันand(they should be the same if your

  3. Voila rootจะเข้าใช้X-Appจากเทอร์มินัล แต่จะชั่วคราวเท่านั้น

หากต้องการทำให้ถาวรดูคำตอบ @Huygens!


1

ทางเลือกอื่น ๆ :

บริการเช่น cron ที่ทำงานภายใต้รูทไม่สามารถเข้าถึงได้หากผู้ใช้ x ปัจจุบันไม่รูท

เราแค่ต้องเพิ่มผู้ใช้รูทไปที่ x คุณสามารถทำได้ในเวลาล็อกอินด้วยสคริปต์เริ่มต้น

xhost local:root

เพื่อวัตถุประสงค์ในการทดสอบเราสามารถรันคำสั่งได้ภายใต้ผู้ใช้ปัจจุบันและเปิดใช้งานรูทสคริปต์ / งาน / บริการ / ...


แค่อยากรู้ว่าทำไมคุณถึงเรียกใช้แอป gui ผ่าน cron
Octopus

ใน distro ของฉันฉันมีงาน cron รูท (msec) ที่ตรวจสอบความปลอดภัยของระบบและทำรายงาน ... ดังนั้นแทนที่จะไปที่บันทึกเพื่อตรวจสอบว่าฉันชอบรายงานที่มี gui ป๊อปอัพกับรายงานเมื่องานนั้นทำงาน
intika

สิ่งนี้ใช้ได้ผลสำหรับฉัน
Marcus Vinicius Pompeu

0

sudoคำสั่งมีสวิทช์ที่จะรักษาตัวแปรสภาพแวดล้อม

 -E, --preserve-env            preserve user environment when running command

เพื่อให้คุณสามารถรันคำสั่งด้วยสวิตช์ -E ตัวอย่าง:

sudo -E wireshark

หากคุณไม่จำเป็นต้องเรียกใช้แอปพลิเคชันที่สำคัญด้านความเป็นส่วนตัวเช่นเว็บเบราว์เซอร์คุณจะต้องเพิ่มสวิตช์ -E ด้วย sudo เราไม่สามารถเรียกใช้ Chrome หรือ Firefox เพียงแค่เพิ่มสวิตช์-E เนื่องจากเบราว์เซอร์จำนวนมากได้นำการป้องกันการละเมิดพื้นที่ผู้ใช้ไปใช้ คำตอบของ @ huygens อาจมีข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้

หมายเหตุ: การเพิ่มสวิทช์ -E จะไม่ช่วยเหลือหากสภาพแวดล้อมของผู้ใช้ไม่ได้มี DISPLAY และ ตั้งค่าไว้แล้วอย่างถูกต้องXAUTHORITY


-1

ใช้คำสั่งนี้และมันจะทำงาน

sudo cp /home/user/.Xauthority .Xauthority

2
สิ่งนี้จะมอบให้cp: cannot stat ‘/home/user/.Xauthority’: No such file or directoryกับเครื่องที่ใช้เดเบียนกว่า 10 เครื่องที่ฉันเข้าถึงได้
Anthon

สิ่งนี้จะให้บริบทเล็กน้อย (เช่นคุณคาดหวังไดเรกทอรีปัจจุบันเงียบ ๆ ) และคุณไม่ได้พูดถึงผลข้างเคียงเช่นปัญหาเมื่อทำเช่นนั้นในหลาย ๆ อินสแตนซ์ X11 ฉันคิดว่าวิธีนี้ค่อนข้างแฮ็ก
v6ak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.