เรียกใช้แอปพลิเคชัน GUI เป็นผู้ใช้อื่น


34

สมมติว่าผมมีบัญชีผู้ใช้ที่ 2 และuser1 user2เมื่อฉันลงชื่อเข้าใช้user1แล้วสลับไปuser2ใช้suฉันสามารถรันโปรแกรมบรรทัดคำสั่งได้ แต่โปรแกรม GUI ล้มเหลว

ตัวอย่าง:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

ดังนั้นฉันจะเรียกใช้โปรแกรมประยุกต์ GUI ได้อย่างไร


หนึ่งในสาเหตุหลักที่ฉันพบว่าสิ่งนี้ล้มเหลวเพราะ$XAUTHORITYยังคงถูกตั้งค่าเป็น user1 ~/.Xauthorityซึ่งฉันเดาว่าโปรแกรมจะพยายามอ่านและมันล้มเหลวเนื่องจากไฟล์นั้นมักจะมีโหมด 0600 ( -rw-------) ซึ่งหมายความว่าไม่สามารถใช้งานได้ สำหรับการอ่านโดยทุกคนในกลุ่ม "อื่น ๆ " ซึ่งรวมถึง user2 หมายความว่าถ้าคุณchmod o+r ~/.Xauthority(ในฐานะผู้ใช้ 1) คุณจะแฮ็ควิธีการแก้ปัญหานี้ ฉันเขียนสคริปต์ที่แสดงถึงสิ่งนี้
Braden สุดยอด

คำตอบ:


42

ซูกับซู -

su - user2เมื่อกลายเป็นผู้ใช้อื่นที่คุณมักต้องการที่จะใช้ เส้นประจะบังคับให้ผู้ใช้ 2 .bash_profileรับที่มา

xhost

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

หมายเหตุ:เมื่อใช้งานxhost +คุณจะต้องเรียกใช้สิ่งนี้ขณะที่ยังอยู่ในเชลล์ที่เป็นของ user1

$ DISPLAY

เมื่อคุณเป็น user2 $DISPLAYคุณอาจจำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อม

$ export DISPLAY=:0.0

1
xhost +user2ยังคงทำให้ผมมีข้อผิดพลาดนี้ xhost: bad hostname "user2"- ฉัน googled บ้างและดูเหมือนว่าฉันต้องทำxhost +user2@laptopหรือxhost +user2@localhostไม่แน่ใจ xhost +user2@localhost being added to access control listจากนั้นก็กล่าวว่า
sashoalm

1
แต่แม้หลังจากเพิ่มผู้ใช้ด้วยxhostและระบุการexport DISPLAY=:0.0วิ่งleafpadยังคงให้ฉันNo protocol specified leafpad: Cannot open display:และล้มเหลวในการทำงาน ผมพบว่าการเชื่อมโยงนี้ที่linuxquestions.org/questions/linux-newbie-8/...xauthซึ่งกล่าวว่ามีบางคุกกี้มายากลและ คุณได้ทดสอบว่าสิ่งเหล่านั้นทำงานบนคอมพิวเตอร์ของคุณหรือไม่ อาจจะมีบางอย่างที่แตกต่างกับการตั้งค่าของฉัน? ฉันใช้ Debian + LXDE
sashoalm

1
ขอบคุณxhost +งานและดูเหมือนว่าจะไม่มีอะไรจำเป็นอีก (ไม่จำเป็นต้องตั้งค่า$DISPLAY) คุณสามารถปรับปรุงคำตอบของคุณและฉันจะยอมรับมันได้หรือไม่
sashoalm

5
โอ้พบบางสิ่ง ในการทำงานของ Fedora 21 xhostให้รายการในรูปแบบSI:localuser:USERNAMEดังนั้นxhost SI:localuser:user2ควรใช้งาน wโอ้และการแสดงผลของผู้ใช้ที่สามารถพบได้โดยใช้
วิลฟ์

7
xhost +จะอนุญาตให้ผู้ใช้บนโฮสต์ใด ๆ ที่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ x ของคุณเพื่อเข้าถึงหน้าจอของคุณ xhost +SI:localuser:user2เหมาะกับฉันใน Debian
robartsd

9

คุณต้องแชร์โทเค็นการตรวจสอบความถูกต้องจากuser1 (สมมติว่า~เป็นหน้าแรกของuser1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null

1
นี่เป็นคำตอบเดียวที่เหมาะกับฉัน (Ubuntu 14)
sudo

โซลูชันนี้ทำงานได้ดีจากภายในเครื่องระยะไกล (= ไคลเอนต์ X Win) ในขณะที่โซลูชั่น xhost ในคำตอบอื่น ๆ จะต้องดำเนินการบนเครื่องท้องถิ่น (= เซิร์ฟเวอร์ X Win)
Jpsy

มันอาจจะปลอดภัยในการใช้tee -aเพื่อหลีกเลี่ยงการ clobbering .Xauthorityข้อมูลที่มีอยู่ใน
สกอตต์

7

คุณสามารถใช้การส่งต่อ X11:

ssh -XY otheruser@localhost your-gui-program-name-here

นี่คือทางออกที่ยอดเยี่ยม เรียบง่ายที่สุดที่ฉันอ่านมา ผู้คนจำนวนมากคุ้นเคยกับ ssh มากกว่าการกำหนดค่า x11
Alexis Panagiotopoulos

6

คุณสามารถเริ่มแอพจากผู้ใช้รายอื่น ฉันจะเริ่มแอพ gimp จาก user2 ในขณะที่กำลังเข้าสู่ระบบ (GUI) กับผู้ใช้ 1:

$ xhost +
$ sudo su user2

(ป้อนรหัสผ่าน)

$ gimp

สนุก :)


4
นี่เป็นเช่นเดียวกับคำตอบที่ยอมรับได้สี่ปี
G-Man กล่าวว่า 'Reinstate Monica'

คุณสามารถบอกวิธีที่ดีกว่าได้อย่างรวดเร็ว?
Antoni Stavrev

ฉันใช้วิธีนี้มาตลอด แต่ก็ไม่ได้ทำงานกับฉันด้วย Debian และ Xfce อีกต่อไป ( แก้ไข : มันไม่ทำงาน แต่ฉันต้องexport DISPLAYแรกเป็นคำตอบที่ได้รับการยอมรับว่า)
Giusti

หลังจากที่คุณสิ้นสุดเซสชันจะเป็นการดีที่จะปิดการใช้งานโดย$ xhost -
Antoni Stavrev

4

คุณอาจลองใช้คำสั่ง sux:

sux user2

sux จะจัดการสิ่งที่ $ DISPLAY ให้คุณ คุณอาจต้องติดตั้งด้วย:

sudo apt-get install sux

ภายใต้ Debian / Ubuntu


4
suxไม่ได้จัดส่งโดย Debian หรือ Ubuntu อีกต่อไป ทางเลือกที่ดีที่สุดที่ฉันสามารถหาได้คือการเพิ่มxhost SI:localuser:root(หรือสิ่งที่ผู้ใช้) ~/.xprofileเพื่ออนุญาตให้ใช้อย่างถาวรหรือเพื่อการใช้งานrunuser
stefanct

มากถึงและรวมถึงการยืด Debian มีgksu/ gksudoทางเลือกที่ทำงานได้ดี ในขณะที่ยังอยู่ใน Sid มันจะถูกลบใน Buster สำหรับปัญหาด้านความปลอดภัย
Matija Nalis

0

ทางเลือกอื่นsuxคือให้รันคำสั่งกราฟิก ( firefox-esrในตัวอย่างด้านล่าง) อย่างปลอดภัยเป็น$AUTHUSER( guestในตัวอย่างด้านล่าง):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

รหัสทำ:

  1. ช่วยให้guestผู้ใช้สามารถเข้าถึงผู้ใช้ปัจจุบันของคุณ$DISPLAYผ่านทางxhost +SI:localuser:guest
  2. ใช้ssh-askpassเพื่อขอรหัสผ่านแบบกราฟิกกับคุณ (แน่นอนคุณสามารถใช้sudoers(5) NOPASSWD:เพื่อหลีกเลี่ยงปัญหานี้ได้หากนโยบายความปลอดภัยของคุณคิดว่าใช้ได้หรือคุณสามารถใช้askpassโปรแกรมอื่นหรือระบุในไฟล์ปรับแต่ง (ดูsudo(8)รายละเอียด--askpass)
  3. หากรหัสผ่านเป็น ok (และคุณมีสิทธิ์ในsudoers(5)) มันทำงานคำสั่ง/usr/bin/firefox-esrในฐานะผู้ใช้อื่น ( guest)
  4. หลังจากโปรแกรมเสร็จสิ้นการอนุญาตให้ผู้ใช้รายอื่น ( guest) ในการเข้าถึงของคุณ$DISPLAYถูกเพิกถอนผ่านxhost -SI:localuser:guest
  5. ในที่สุดsudo -Kลบรหัสผ่านที่แคชดังนั้นการร้องขอครั้งต่อไปssh-askpassจะขอรหัสผ่านอีกครั้ง (แทนที่จะใช้รหัสผ่านที่เก็บไว้)

    ในขณะที่มันใช้งานได้น้อยกว่าสิ่งที่ทำgksu(8)หรือsux(8)ทำอยู่ก็สามารถเขียนสคริปต์ได้และมีความปลอดภัยมากกว่า:

    • xhost + (ผู้ใช้รายใดก็ตามจะสามารถเข้าถึงการแสดงผลกราฟิกของคุณตราบเท่าที่ยังมีผลอยู่)
    • สามารถอ่านได้ ~ / .xauth โดยผู้ใช้รายอื่น (ผู้ใช้รายนั้นเข้าถึงการแสดงผลของคุณโดยไม่ จำกัด จำนวน)
    • อะไรgksu/ suxทำอะไร (คัดลอกชั่วคราว~/.Xauthorityซึ่งอนุญาตให้ผู้ใช้ที่ระบุเพื่อคัดลอกของคุณMIT-MAGIC-COOKIE-1และใช้จอแสดงผลของคุณต่อไปแม้หลังจาก gksu / sux เสร็จสิ้นแล้ว (ตราบใดที่คุณไม่ได้ปิดเครื่องหรือออกจากระบบการแสดงผล - หน้าจอ คุกกี้).

เนื่องจากจะอนุญาตให้ผู้ใช้ภายในเครื่องเดียวเข้าถึงการแสดงผลของคุณและจากนั้นตราบใดที่คำสั่งรัน (เมื่อคำสั่งเสร็จสิ้น$AUTHUSERจะไม่สามารถเข้าถึงการแสดงผลของคุณได้อีกต่อไป)

ทางเลือกที่ปลอดภัยอีกทางหนึ่งคือ ssh -X(หากไม่มี-Yซึ่งจะทำให้คุณปลอดภัยน้อยลง! ดูForwardX11Trustedในssh_config(5)รายละเอียด) เช่นเดียวกับที่ใช้งานได้ง่ายกว่าถ้าคุณไม่ได้เขียนสคริปต์ แต่จะทำให้เกิด overhead additinal โดยไม่ต้องปลอดภัย -Y


-1

คุณจำเป็นต้องโหลด 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 ใด ๆ


(1) ไม่มีคำถามใด ๆ ที่ต้องใช้การทำงานแบบ root หรือการทำงานแบบ root จะเป็นประโยชน์ (1b) หากมีสิ่งใดการทำงานในฐานะรูทอาจทำให้เกิดความสับสน (2) มีไม่ค่อย (ถ้าเคย) sudo suเหตุผลที่จะใช้งานใด ใช้  sudoหรือ  su; เลือกหนึ่ง. (3) คำถามที่ถูกเขียนในแง่ของ  และuser1user2กรุณาเขียนคำตอบของคุณในแง่ของ  และuser1user2(ทำหรือไม่ไม่มี  tri.) (4) SI:localuserคำตอบของคุณจะดีกว่าถ้ามันรวมถึงคำอธิบายของ ……………………โปรดอย่าตอบในความคิดเห็น แก้ไข  คำตอบของคุณเพื่อให้ชัดเจนและสมบูรณ์ยิ่งขึ้น
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.