ฉันสามารถเปิดโปรแกรมกราฟิกบนเดสก์ท็อปของผู้ใช้คนอื่นเป็นรูทได้หรือไม่?


39

ต่อไปนี้เป็นคำถามอื่นที่ฉันคิดว่าฉันต้องรู้

  • จากเซสชันที่ไม่ใช่ X (หมายถึงรูทไม่ได้ลงชื่อเข้าใช้ X)

  • หากมีหลายคนลงชื่อเข้าใช้ด้วย X ฉันสามารถตรวจจับอัตโนมัติว่าใครอยู่บนหน้าจอใดและโปรแกรมตรวจจับหน้าจอใดที่ฉันต้องเปิดแอปด้วยโปรแกรม

  • ฉันสามารถเปิดแอพในฐานะผู้ใช้ได้หรือไม่? (ตกลงฉัน 99.999% แน่ใจว่านี่คือใช่)

  • ฉันสามารถตรวจสอบได้ว่าผู้ใช้กลุ่ม X ล็อกอินเข้าสู่ X หรือไม่


โปรดระวังว่าnaga_plugged.plสคริปต์เสร็จสิ้น (หรือแยกเป็นแบ็คกราวน์) เนื่องจากudevจะรอให้สคริปต์ออก
rozcietrzewiacz

ขอบคุณฉันทำให้มันเป็น daemon โดยการเรียก daemon (0,0) ในรหัส c ที่ naga_plugged.pl โทรครั้งสุดท้าย ฉันไม่เคยใหม่พวกเขามีฟอรั่มยูนิกซ์ที่นี่ พวกเขาควรทำให้มันเป็นทั้งไซต์เดียวแทนที่จะเป็นโดเมนใหม่
over_optimistic

คำตอบ:


23

ในการเปิดตัวโปรแกรมกราฟิกบนเดสก์ท็อปของผู้ใช้คุณต้องค้นหาสองสิ่ง: สิ่งที่แสดงว่าเดสก์ท็อปของผู้ใช้เปิดอยู่ (ที่อยู่) และคุกกี้การอนุญาตใดที่จะใช้ (รหัสผ่าน)

คำสั่งต่อไปนี้ควรแสดงรายการโลคัลที่ผู้ใช้ล็อกออน (หนึ่งรายการต่อบรรทัด) โดยส่วนใหญ่:

who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'

การค้นหาคุกกี้การให้สิทธิ์นั้นยากกว่านิดหน่อย คุณต้องค้นหาไฟล์คุกกี้ของผู้ใช้ซึ่งเป็น~/.Xauthorityค่าเริ่มต้น (สิ่งที่คุณต้องการคือที่ตั้งของไฟล์คุกกี้คุณไม่จำเป็นต้องแยกคุกกี้ออกจากมัน) สิ่งนี้ใช้ได้กับหลาย ๆ ระบบ แต่ไม่ใช่ทั้งหมด มันขึ้นอยู่กับตัวจัดการการแสดงผลและวิธีการตั้งค่าและโดยเฉพาะอย่างยิ่ง Gdm (ค่าเริ่มต้นบน Ubuntu) ไม่ได้ใช้ตำแหน่งเริ่มต้นล่าสุดที่ฉันดู ฉันไม่สามารถนึกถึงวิธีพกพาเพื่อค้นหาไฟล์ X cookie ที่แท้จริง วิธีที่แม่นยำที่สุดในการค้นหาคือการหา pid ของกระบวนการ X และหาอาร์กิวเมนต์ของ-authตัวเลือก อีกวิธีหนึ่งคือการค้นหากระบวนการที่ทำงานบนเซิร์ฟเวอร์ X นั้นและหยิบXAUTHORITYตัวแปร environemnt หากคุณมีปัญหาในการค้นหาไฟล์คุกกี้โปรดดูเปิดหน้าต่างบนจอแสดงผล X ระยะไกล (ทำไม "ไม่สามารถเปิดจอแสดงผล")

เมื่อคุณมีข้อมูลทั้งสองชิ้นแล้วให้วางจอแสดงผลที่เลือกไว้ในDISPLAYตัวแปรสภาพแวดล้อมไฟล์คุกกี้ X Authority ที่เลือกไว้ในXAUTHORITYตัวแปรสภาพแวดล้อมและคุณตั้งค่าไว้ ไม่สำคัญว่าผู้ใช้โปรแกรมจะทำงานอย่างไร รวมกับsuหากคุณต้องการ


"ค้นหาอาร์กิวเมนต์ไปที่ตัวเลือก -auth" อย่างไร
rubo77


ตกลงpids=$(pgrep -u $target_user nautilus)ได้รับ pid และฉันจะต้องใส่-authตัวเลือกที่ไหน?
rubo77

1
@ rubo77 คุณไม่ได้ใส่-authตัวเลือกใด ๆ คุณอาจต้องค้นหามันในบรรทัดคำสั่งของกระบวนการเซิร์ฟเวอร์ X เพื่อหาว่าจะใส่อะไรในXAUTHORITYตัวแปรสภาพแวดล้อม หากคุณมีกระบวนการของลูกค้าสิ่งที่คุณต้องการไม่เกี่ยวกับอะไร-authแต่คุณค่าของXAUTHORITYตัวแปรของลูกค้านั้น ฉันไม่เข้าใจว่าคุณกำลังพยายามทำอะไร คุณอาจต้องการถามคำถามใหม่
Gilles 'หยุดชั่วร้าย'

ฉันพยายามใช้ข้อมูลของคุณที่นี่เพื่อแก้ปัญหาวิธีสร้างการแจ้งเตือนบนหน้าจอที่เริ่มโดย root
rubo77

11

ฉันไม่สามารถลองได้อย่างสมบูรณ์เนื่องจากเครื่องทั้งหมดของฉันปิดใช้งานรูท

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

who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'

จากนั้นเพื่อเรียกใช้คำสั่งกราฟิก X บนจอแสดงผลนั้น:

DISPLAY=:0 firefox &

โดยที่: 0 จะถูกแทนที่ด้วยสิ่งที่แสดงที่คุณพบในคำสั่งแรกและ firefox จะถูกแทนที่ด้วยคำสั่งอะไรก็ตามที่คุณต้องการเรียกใช้ คุณสามารถใส่มันลงในเชลล์สคริปต์และใช้ตัวแปร

ส่วนต่อไปคือส่วนที่ฉันยังไม่ได้ทดสอบ แต่ฉันไม่เห็นว่าทำไมจึงไม่ควรทำ:

su username -c "DISPLAY=:0 firefox"

เพื่อเรียกใช้คำสั่ง X ในฐานะผู้ใช้นั้น


1
เพียงเพราะรูทถูกปิดการใช้งานไม่ได้หมายความว่าสิ่งต่าง ๆ จะไม่ถูกเรียกใช้ในฐานะรูท;) ที่จริงฉันต้องเรียกใช้สิ่งนี้ในฐานะสคริปต์ที่ทำงานเหมือนรูท
xenoterracide

@xenoterracide ใช่ไหม ทั้งหมดที่ฉันหมายถึงคือฉันไม่สามารถทดสอบภายใต้สถานการณ์ที่เป็นไปได้ทั้งหมด นั่นคือฉันทดสอบเฉพาะการใช้รูทsudo -iและไม่แน่ใจว่าผลลัพธ์จะแตกต่างจากการรันหลังจากเข้าสู่ระบบในฐานะรูทโดยตรง :-)
Steven D

ฉันต้องแก้ไขใครสักคน นี้who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ ดูเหมือนว่าจะทำงาน ...
xenoterracide

ทำไมทุกคนใช้ grep และ sed เมื่อมี awk อยู่แล้วในโซ่ที่อยู่นอกเหนือฉัน

ใช่ ... "เรียนรู้ awk" อยู่ในรายการสิ่งที่ต้องทำของฉันมาระยะหนึ่งแล้ว
Steven D

4

คุณสามารถดูว่า acpid ทำอย่างไร เช่นเมื่อมันออกคำสั่ง xscreensaver หรือทำให้หน้าจอว่างสำหรับผู้ใช้ที่ใช้งาน X หรือ X-session

ตัวอย่างเช่นภายใต้ Ubuntu ไฟล์นี้มีเนื้อหาที่เกี่ยวข้อง:

/etc/acpi/lid.sh

มีลูปนี้:

for x in /tmp/.X11-unix/*; do
    displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
    getXuser;
    if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
        grep -q off-line /proc/acpi/ac_adapter/*/state
        if [ $? = 1 ]
            then
            if pidof xscreensaver > /dev/null; then 
                su $user -c "xscreensaver-command -unthrottle"
            fi
        fi
        if [ x$RADEON_LIGHT = xtrue ]; then
            [ -x /usr/sbin/radeontool ] && radeontool light on
        fi
        if [ `pidof xscreensaver` ]; then
            su $user -c "xscreensaver-command -deactivate"
        fi
        su $user -c "xset dpms force on"
    fi
done

โดยเฉพาะอย่างยิ่งรหัสคือสิ่ง/usr/share/acpi-support/power-funcsต่อไปนี้ มันเรียกร้องfgconsoleให้ค้นหา Linux vt ที่ใช้งานอยู่จากนั้นค้นหาเซิร์ฟเวอร์ X ที่แสดงบนคอนโซลนี้และค้นหาผู้ใช้จากที่นั่น จากนั้นจะใช้~/.Xauthorityเป็นคุกกี้ X ซึ่งถ้าไม่มีสิ่งที่ฉันหายไปหมายความว่ามันจะไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ X ได้ (การตั้งค่าเริ่มต้นของ Ubuntu โดยใช้ gdm ไม่ได้เก็บคุกกี้ X ไว้ในบ้านของผู้ใช้ directory)
Gilles 'หยุดความชั่วร้าย'

ตัวอย่างเช่น @Gilles lid.sh ไม่ได้เรียกใช้ getXconsole ดังนั้นไม่ใช้ fgconsole ฉันอัปเดตคำตอบด้วยข้อมูลโค้ดที่มีในใจ และใช้งานได้จริงบน Ubuntu หน้าจอจะว่างเปล่าเมื่อฉันปิดฝา
maxschlepzig

1
ใน Ubuntu 14.04 ฉันได้รับข้อผิดพลาดgetXuser: command not found
rubo77

1

ส่วนขยายของคำตอบ Gilles คือวิธีค้นหาไฟล์คุกกี้ วิธีหนึ่งในการทำอาจเป็นหลังจากคุณตั้งค่าDISPLAYตัวแปรสภาพแวดล้อม (ตามที่อธิบายโดย Gilles) ใช้straceเพื่อค้นหาการxhostเข้าถึงไฟล์ ฉันสามารถคิดบางอย่างเช่นนี้ใน BASH:

# Set the DISPLAY variable first
DISPLAY = :0.0
# Use strace on xhost
strace xhost 2>&1 | grep access

ผลลัพธ์จากโค้ดด้านบนจะมีลักษณะดังนี้:

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/home/someuser/.Xauthority", R_OK) = 0

อย่างที่คุณเห็นอย่างชัดเจนไฟล์คุกกี้จะปรากฏที่นี่โดยตรง


0

ในการวิจัยของฉันในการค้นหาวิธีที่ยอดเยี่ยมในการแสดงงาน GUI หรือ X จากสภาพแวดล้อมที่ จำกัด เช่นกฎของ udev หรือจากผู้ใช้ขั้นสูงฉันเพิ่งสร้างเครื่องมือที่เหมาะสมกับมัน ( สำหรับรายละเอียดเพิ่มเติม )

xpub เป็นเชลล์สคริปต์เพื่อรับตัวแปรของสภาพแวดล้อมการแสดง X เกี่ยวกับปัจจุบันหรือ TTY ที่กำหนด

นี่คือตัวอย่างที่มีกฎ udev:

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}: ถ้าผู้ใช้ tty ปัจจุบันเริ่ม X ให้ลบออก

หลักการเหมือนกันสำหรับบรรทัดคำสั่งโดยใช้export:

export $(xpub) ; su ${XUSER} -c 'notify-send Hello'

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