วิธีแก้ไข 'ไม่ได้ระบุโปรโตคอล' สำหรับผู้ใช้ su


15

ฉันกำลังพยายามใช้ผู้ใช้สำรอง (ไม่ใช่ผู้ดูแลระบบ) เพื่อเรียกใช้ซอฟต์แวร์กราฟิกในระบบของฉัน ผู้ใช้สำรองนี้ได้รับการตั้งชื่อและมอบ UID และ GID ให้ตรงกับผู้ใช้ระบบระยะไกลที่มีชื่อเดียวกัน UID คือ 500 ดังนั้นฉันเชื่อว่าทำให้ผู้ใช้เป็นผู้ใช้ที่ไม่ได้ลงชื่อเข้าใช้

เริ่มต้นจาก Ubuntu เข้าสู่บัญชีหลักของฉันฉันเปิดเทอร์มินัลและsuผู้ใช้สำรอง ฉันพยายามเรียกใช้คำสั่งเพื่อเริ่มแอปพลิเคชันและรับ 'ไม่ได้ระบุโปรโตคอล'

นี่เป็นเพราะ UID <1,000 เนื่องจากsuหรือไม่ใช่ผู้ดูแลระบบของผู้ใช้หรือไม่ ฉันจะให้ผู้ใช้รายนี้ใช้งานแอปพลิเคชันด้วย GUI ได้อย่างไร

คำตอบ:


15

ปัญหาไม่เกิดขึ้นเนื่องจาก UID ของผู้ใช้ 500 นั้นใช้งานได้ดีในฐานะ UID และ UID นั้นไม่ได้ทำให้เป็นผู้ใช้ 'ที่ไม่ได้ลงชื่อเข้าใช้' ยกเว้นในแง่ของการตั้งค่าเริ่มต้นของเครื่องมือจัดการการแสดงผลบางอย่าง

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

ลองใช้วิธีนี้ในฐานะผู้ใช้ดั้งเดิมของคุณเพื่อคัดลอกคุกกี้ X11 ไปยังบัญชีอื่น:

su - <otheruser> -c "unset XAUTHORITY; xauth add $(xauth list)"

จากนั้นเรียกใช้แอปพลิเคชันของคุณ คุณอาจต้อง unset XAUTHORITYในเชลล์นั้นด้วย คำสั่งนั้นจะแยกมายากลคุกกี้ ( xauth list) จากผู้ใช้หลักของคุณและเพิ่ม ( xauth add) ไปยังตำแหน่งที่ผู้ใช้รายอื่นสามารถรับได้


โดยปกติแล้วการใช้คำสั่งที่ยกมาของคุณจะให้ 'su: ต้องเรียกใช้จากเทอร์มินัล' แต่มันก็เป็นในขั้ว ...
J คอลลิน

@JCollins ลองxauth list >/tmp/xa.$$; su - <otheruser> -c "unset XAUTHORITY; xargs xauth add </tmp/xa.$$"; rm -f /tmp/xa.$$แต่ระวังว่ามีสภาพการแข่งขันที่น่ากลัวอยู่ในนั้น
roaima

@JCollins อ๊ะใช่ว่าจะเป็นปัญหาหากsuต้องการขอรหัสผ่าน ลองคำสั่งใหม่นี้
Celada

@Celada ทองคำทำงานได้ดี คุณช่วยอธิบายรายละเอียดว่าคำสั่งนั้นทำอะไรได้บ้างและอย่างไร? และอาจอธิบายได้ว่าทำไมการจุติดั้งเดิมไม่ได้?
J Collins

1
@JCollins คุณจะต้องทำซ้ำทุกครั้งหลังจากที่คุณออกจากระบบและเข้าสู่ระบบเพราะคุกกี้เวทใหม่จะถูกสร้างขึ้นในแต่ละครั้ง เป็นเรื่องปกติมันเป็นส่วนหนึ่งของโมเดลความปลอดภัย
Celada

6

ในกรณีของฉันเซิร์ฟเวอร์แสดงผลใหม่waylandมีปัญหา

เพียงแค่xhost + local:ผู้ใช้แล้วอื่น ๆ (เช่น root) ได้รับอนุญาตให้ทำงาน programms ในเซสชั่นของคุณเชื่อมต่อเครือข่าย แต่จะไม่ได้รับอนุญาต

หากคุณต้องการอนุญาตให้ไคลเอนต์จากโฮสต์ใด ๆคุณสามารถใช้xhost +โดยไม่ต้องระบุโฮสต์ใด ๆ เลย อย่างไรก็ตามสิ่งนี้ไม่ปลอดภัยจะเป็นการดีกว่าที่จะระบุโฮสต์ที่คุณต้องการให้สิทธิ์เข้าถึงเซสชันของคุณ


1
ในกรณีของฉันxhost +ก็เพียงพอแล้ว
อันตราย 89

1
@ danger89 ในขณะที่มันใช้งานได้มันช่วยให้โฮสต์ใด ๆ เชื่อมต่อกับเซสชันของคุณหากคุณไม่มีกฎไฟร์วอลล์เพื่อป้องกันการเข้าถึงระยะไกล (ไม่ใช่ทุกการแจกจ่ายมีกฎไฟร์วอลล์ซึ่งปฏิเสธคำขอที่เข้ามาทั้งหมดเช่น ubuntu ไม่มีกฎที่กำหนดไว้ล่วงหน้าเพื่อป้องกันการเข้าถึงเซิร์ฟเวอร์เช่น samba หรือ apache ที่ผู้ใช้อาจต้องการติดตั้ง) ดังนั้นสำหรับผู้ใช้ linux ใหม่สิ่งนี้อาจเป็นปัญหาได้ ส่วนตัวฉันจะ จำกัด การเข้าถึงเพียงเพื่อจะอยู่ในด้านการประหยัด
MADforFUNandHappy

3

ลองอะไรแบบนั้น

$ export LOGIN_USER="Math"
$ su - $LOGIN_USER
$ sudo xhost local:$LOGIN_USER &>/dev/null

แหล่ง

Ps : คำตอบที่ยอมรับไม่ได้สำหรับฉัน


3

สมมติว่าคุณต้องการดุร้ายกำลังเชื่อมต่อกับ X ...

สมมติว่าคุณกำลังรันคำสั่งของคุณบนเซิร์ฟเวอร์ (โดยที่ X รัน) มิฉะนั้นให้ทำงานก่อนแล้วใช้ 'ssh -X user @ server) จากไคลเอนต์หลังจากนั้น;)

อาจมีหลายวิธีในการเรียกใช้คำสั่ง xauth ตัวอย่างเช่นคุณอาจใช้ 'sudo' แต่อาจสูญเสียหรือเปลี่ยนตัวแปรสภาพแวดล้อม ตัวแปรสภาวะแวดล้อมต่อไปนี้ต้องถูกรักษาไว้: DISPLAY และ XAUTHORITY เพื่อทดสอบว่าเป็นกรณีนี้หรือไม่คุณสามารถเรียกใช้ 'echo $ XAUTHORITY' ในแบบเดียวกับที่คุณรันคำสั่ง แต่ให้แน่ใจว่าคุณไม่ได้ขยายตัวแปรสภาพแวดล้อมก่อนที่จะรันคำสั่งเหล่านั้น ตัวอย่างเช่นลอง: sudo bash -c 'echo "$ XAUTHORITY"' เพื่อดูว่า XAUTHORITY คืออะไรหลังจากที่คุณเรียกใช้ sudo (ถ้าหายไปคุณอาจต้องเพิ่มบางสิ่งลงในไฟล์ sudoers ของคุณดูที่อื่น)

ในที่สุดให้รันคำสั่งต่อไปนี้ในฐานะผู้ใช้ที่คุณต้องการเข้าถึงด้วยบนเซิร์ฟเวอร์:

xauth info

สิ่งนี้จะแสดง 'ไฟล์ผู้มีอำนาจ' ที่จะใช้ (/root/.Xauthority ตามค่าเริ่มต้นสำหรับรูทหรือบางอย่างเช่น /home/theuser/.Xauthority) ถ้ามันแสดงไฟล์. Xauthority ที่ถูกต้องคุณไม่ต้องกังวลเกี่ยวกับตัวแปรสภาพแวดล้อม XAUTHORITY จริง ๆ (จริง ๆ แล้วฉันไม่รู้ว่ามันจะไม่เกิดขึ้นยกเว้นในกรณีที่คุณต้องการจัดการกับสถานที่ที่ไม่ได้มาตรฐานของไฟล์นั้น )

ลบไฟล์นั้น (หากยังมีอยู่):

rm /root/.Xauthority

แทนที่/root/.Xauthorityด้วยไฟล์ XAUTHORITY ที่ถูกต้องสำหรับเคสของคุณ

สร้างใหม่ แต่ว่างเปล่า (จำเป็นสำหรับคำสั่งจำนวนมาก):

touch /root/.Xauthority

ณ จุดนี้คุณจะได้รับข้อผิดพลาดที่ไม่ระบุโปรโตคอลแม้ว่าคุณจะได้รับMIT-MAGIC-COOKIE-1 ไม่ถูกต้องมาก่อน ค้นหาไฟล์สิทธิใช้งานที่เซิร์ฟเวอร์ X ใช้อยู่ในขณะนี้:

ps aux | grep Xorg

สิ่งนี้ควรแสดงสิ่งที่ชอบ:

root 1153 0.0 1.0 149560 44464 tty7 Ss+ dec02 0:00 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711} -background none -noreset -displayfd 17 vt7

ชื่อไฟล์หลังจากนั้น-authเป็นสิ่งที่คุณต้องการในคำสั่งถัดไป รันสิ่งนี้เป็นรูท:

sudo xauth -f '/var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711}' list

ที่แสดงรายการคีย์เลขฐานสิบหก 32 หลัก ตัวอย่างเช่นผลลัพธ์อาจเป็น:

hostname/unix:0 MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7

ใช้สิ่งนั้นเพื่อสร้างไฟล์. Xauthority ของคุณ (ในฐานะผู้ใช้ที่ต้องลงชื่อเข้าใช้อีกครั้ง):

xauth add $DISPLAY MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7

แทนที่ 'c0eaf749aa252101a0f57d5087089db7' ด้วยสิ่งที่ถูกส่งคืนโดยคำสั่ง list สำหรับคุณ ตอนนี้. สิทธิ์ของคุณควรมีขนาด 51 ไบต์และคุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ X (อีกครั้ง)


ไม่มีเธรดนี่เป็นเว็บไซต์ถามตอบไม่ใช่ฟอรัม
Anthon

1

ฉันมีข้อผิดพลาดนี้ "ไม่ได้ระบุโปรโตคอล" เมื่อฉันเริ่มต้นอินสแตนซ์ของ Selenium 3.3.1 จากสคริปต์ upstart แล้วใช้ไดรเวอร์ Chrome ใน Selenium ซีลีเนียมวิ่งในฐานะผู้ใช้เดียวกับ X11 และตั้งค่าตัวแปรสภาพแวดล้อมเชลล์ DISPLAY อย่างถูกต้อง สิ่งที่น่าสนใจคือข้อผิดพลาดนี้ไม่ได้เกิดขึ้นเมื่อฉันใช้ไดรเวอร์ Firefox การตั้งค่าตัวแปรสภาพแวดล้อมเชลล์ XAUTHORITY ภายในสคริปต์ upstart ให้ชี้ไปที่ค่า $ XAUTHORITY ของผู้ใช้ X11 ที่ใช้งานอยู่ได้แก้ไขข้อผิดพลาดสำหรับไดรเวอร์ Chrome

ในหมายเหตุด้านข้อผิดพลาด "ไม่ได้ระบุโปรโตคอล" ถูกฝังอย่างละเอียดโดยไดรเวอร์ Chrome / Chrome และไม่สามารถหาได้ง่าย ฉันสังเกตเห็นว่า Chrome ยังคงสร้างไดเรกทอรีในรูปแบบของ/tmp/.org.chromium.Chromium.*แต่พวกเขาก็หายไปอย่างรวดเร็ว ฉันจัดการสังเกตเห็นว่าพวกเขามีไฟล์chrome_debug.logที่มีข้อความ "ไม่สามารถเปิดการแสดงผล" ฉันคิดว่ามันค่อนข้างแปลกเพราะฉันได้ตรวจสอบแล้วว่ากระบวนการซีลีเนียมมีการแสดงผลที่ถูกต้อง/proc/$pid/environและตรวจสอบผลลัพธ์ของstraceกระบวนการซีลีเนียมอย่างละเอียดมากขึ้นซึ่งเผยให้เห็นว่า

ข้อผิดพลาดนี้สามารถทำซ้ำได้โดยยกเลิกการกำหนด XAUTHORITY และพยายามเรียกใช้ไคลเอ็นต์ X11 บางตัว ตัวอย่างเช่น:

$ XAUTHORITY= xeyes
No protocol specified
Error: Can't open display: :0.0

0

มันง่ายมาก ปัญหาเกิดขึ้นเมื่อคุณอยู่ในปทรูทและต้องการใช้gksu เพียงออกจาก สถานะรูทแล้วลองอีกครั้ง


0

เพียงพิมพ์สิ่งนี้ลงในเทอร์มินัลxhost +SI:localuser:rootหลังจากที่คุณพิมพ์export DISPLAY=:0.0จากนั้นลองอีกครั้ง


0

การใช้เบาะแสในคำตอบที่ยอมรับได้ฉันสามารถแก้ปัญหาต่างกันได้:

  1. ค้นหาไฟล์ Xauth ในบัญชีที่ใช้งานได้ (Xauth1)
  2. ค้นหาไฟล์ Xauth ในบัญชีที่ไม่ได้ (Xauth2)
  3. คัดลอก Xauth1 ไปยัง Xauth2
  4. เปลี่ยนการอนุญาตของ Xauth2

ในรหัส:

root@45c4933a8f1a:~# xauth info
Authority file:       /headless/.Xauthority
<snip>
root@45c4933a8f1a:~# su OtherUser
OtherUser@45c4933a8f1a:/headless$ xauth info
Authority file:       /home/OtherUser/.Xauthority
<snip>
OtherUser@45c4933a8f1a:/headless$ exit
exit
root@45c4933a8f1a:~# cp /headless/.Xauthority /home/OtherUser/.Xauthority 
root@45c4933a8f1a:~# chown OtherUser:OtherUser /home/OtherUser/.Xauthority
root@45c4933a8f1a:~# su OtherUser

0

Let ว่าคุณพยายามที่จะเข้าถึง GUI เป็นuser2 ( ผู้ใช้ปกติ ) แล้วคุณจำเป็นต้องโหลด UI ติดตั้งuser2

ลองทำสิ่งนี้:

เข้าสู่ระบบด้วยroot :

sudo su

ทดสอบเซิร์ฟเวอร์ x:

xclock

หากคุณเห็นว่านาฬิกาทำงานดีแล้วลองทำสิ่งนี้ดู:

xhost

ผลลัพธ์ควรเป็นดังนี้:

xhost SI:localuser:tri
# tri is my user name

ตอนนี้ขอuser2 xhost เข้าถึง

xhost +SI:localuser:user2

ตอนนี้ให้ลองล็อกอินอีกครั้งกับuser2และลองเปิดโปรแกรม GUI ใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.