Tôi có thể khởi chạy một chương trình đồ họa trên máy tính để bàn của người dùng khác bằng root không?


39

Sau đây là những câu hỏi khác mà tôi nghĩ rằng tôi cần biết:

  • Từ một phiên không X? (có nghĩa là root không đăng nhập vào X)

  • Nếu nhiều người đã đăng nhập vào X, tôi có thể tự động phát hiện ai đang ở trên màn hình nào không và do đó lập trình phát hiện màn hình nào tôi cần để khởi chạy ứng dụng?

  • Tôi có thể khởi chạy ứng dụng với tư cách người dùng không? (ok Tôi chắc chắn 99,999% đây là có)

  • Tôi có thể phát hiện nếu người dùng của nhóm X được đăng nhập vào X không?


Cẩn thận rằng naga_plugged.plkịch bản kết thúc (hoặc chuyển thành nền), vì udevsẽ chờ nó thoát ra.
rozcietrzewiacz

cảm ơn tôi đã biến nó thành một daemon bằng cách gọi daemon (0,0) trong mã c mà naga_plugged.pl gọi lần cuối. Tôi không bao giờ mới họ có diễn đàn unix ở đây. Họ nên làm cho nó là tất cả một trang web thay vì các tên miền mới.
over_optimistic

Câu trả lời:


23

Để khởi chạy một chương trình đồ họa trên máy tính để bàn của người dùng, bạn cần tìm hai thứ: màn hình máy tính của người dùng đang bật (địa chỉ) và cookie ủy quyền nào sẽ sử dụng (mật khẩu).

Lệnh sau sẽ liệt kê các màn hình cục bộ mà người dùng đã đăng nhập (một trên mỗi dòng) trên hầu hết các thông báo:

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

Tìm cookie ủy quyền khó hơn một chút. Bạn phải tìm tệp cookie của người dùng, ~/.Xauthoritytheo mặc định (tất cả những gì bạn cần là vị trí của tệp cookie, bạn không cần phải trích xuất cookie từ nó). Điều đó hoạt động trên nhiều hệ thống, nhưng không phải tất cả; nó phụ thuộc vào trình quản lý hiển thị và cách thiết lập, và cụ thể là Btm (mặc định trên Ubuntu) đã không sử dụng vị trí mặc định cuối cùng tôi nhìn. Tôi không thể nghĩ ra một cách di động để tìm ra tệp cookie X thực tế. Cách chính xác nhất để tìm hiểu là tìm ra mấu chốt của quy trình X và tìm kiếm đối số cho -authtùy chọn. Một cách khác là tìm một tiến trình đang chạy trên máy chủ X đó và lấy XAUTHORITYbiến môi trường của nó . Nếu bạn gặp khó khăn khi tìm tệp cookie, hãy xemMở một cửa sổ trên màn hình X từ xa (tại sao "Không thể mở màn hình")?

Khi bạn có cả hai thông tin, hãy đặt màn hình đã chọn vào DISPLAYbiến môi trường, tệp cookie thẩm quyền X được chọn trong XAUTHORITYbiến môi trường và bạn đã đặt. Nó không quan trọng người dùng chương trình chạy như thế nào; kết hợp với sunếu bạn thích.


Làm thế nào để "tìm kiếm đối số cho tùy chọn -auth" của bạn?
rubo77

@ rubo77 Có pshoặc htophoặc
Gilles 'SO- ngừng trở nên xấu xa'

OK, vậy nên pids=$(pgrep -u $target_user nautilus)lấy pid, và tôi phải đặt -authtùy chọn ở đâu?
rubo77

1
@ rubo77 Bạn không đặt -authtùy chọn ở bất cứ đâu. Bạn có thể cần tìm nó trong dòng lệnh của quy trình máy chủ X để tìm ra những gì cần đặt trong XAUTHORITYbiến môi trường. Nếu bạn có quy trình của một khách hàng, những gì bạn cần không phải là bất cứ điều gì -authngoài giá trị của XAUTHORITYbiến của khách hàng đó. Tôi không hiểu bạn đang cố gắng làm gì. Bạn có thể muốn hỏi một câu hỏi mới.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi cố gắng sử dụng thông tin của bạn ở đây để giải quyết cách tạo thông báo trên màn hình được khởi tạo bởi root
rubo77

11

Tôi hoàn toàn không thể thử điều này vì tất cả các máy của tôi đã bị vô hiệu hóa root.

Để tìm màn hình người dùng đang bật, bạn có thể sử dụng wholệnh. Cột đầu ra cuối cùng thường là HIỂN THỊ mà người dùng đã đăng nhập. Một cái gì đó như thế này có thể được sử dụng để lấy chỉ màn hình (có thể có một cách hiệu quả hơn nhiều để làm điều này, vui lòng cung cấp các chỉnh sửa):

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

Sau đó, để khởi chạy một lệnh đồ họa X trên màn hình đó:

DISPLAY=:0 firefox &

trong đó: 0 sẽ được thay thế bằng bất kỳ màn hình nào bạn tìm thấy trong lệnh đầu tiên và firefox sẽ được thay thế bằng bất kỳ lệnh nào bạn muốn chạy. Bạn có thể đặt nó trong một kịch bản shell và chỉ cần sử dụng một biến.

Phần tiếp theo là phần tôi chưa thử nghiệm, nhưng tôi không hiểu tại sao không nên làm:

su username -c "DISPLAY=:0 firefox"

để khởi chạy lệnh X như người dùng đó.


1
Chỉ vì root bị vô hiệu hóa không có nghĩa là công cụ không được chạy dưới quyền root;) Tôi thực sự cần chạy nó như một đoạn script chạy dưới quyền root.
xenoterracide

@xenoterracide, phải. Tất cả những gì tôi muốn nói là tôi không thể kiểm tra nó trong mọi trường hợp có thể. Đó là, tôi chỉ kiểm tra nó dưới dạng root bằng cách sử dụng sudo -ivà không thể chắc chắn liệu kết quả có khác với chạy nó sau khi đăng nhập trực tiếp bằng root hay không. :-)
Steven D

Tôi đã phải sửa đổi người một chút. Điều này who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ dường như hoạt động ...
xenoterracide

tại sao bất cứ ai sử dụng grep và sed khi đã có awk trong chuỗi nằm ngoài tôi.

yeah ... "learn awk" đã có trong danh sách việc cần làm của tôi một thời gian rồi.
Steven D

4

Bạn có thể nhìn vào cách acpid làm điều đó. Ví dụ: khi nó phát lệnh xscreenaver hoặc làm trống màn hình cho mỗi người dùng đang chạy phiên X hoặc X.

Ví dụ trong Ubuntu tệp này chứa các nội dung liên quan:

/etc/acpi/lid.sh

Chứa vòng lặp này:

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

Cụ thể, mã là trong /usr/share/acpi-support/power-funcs. Nó gọi fgconsoleđể tìm Linux vt đang hoạt động, sau đó tìm máy chủ X hiển thị trên bảng điều khiển này và tìm ra người dùng từ đó. Sau đó, nó sử dụng ~/.Xauthoritylàm cookie X, trừ khi tôi thiếu thứ gì đó có nghĩa là nó thực sự không thể kết nối với máy chủ X (thiết lập mặc định của Ubuntu, sử dụng gdm, không lưu trữ cookie X trong nhà của người dùng danh mục).
Gilles 'SO- ngừng trở nên xấu xa'

Ví dụ @Gilles.sh không gọi getXconsole. Do đó, fgconsole không được sử dụng. Tôi đã cập nhật câu trả lời với đoạn trích tôi đã nghĩ đến. Và nó thực sự hoạt động trên Ubuntu. Màn hình bị trống khi tôi đóng nắp.
maxschlepzig

1
Trong phiên bản Ubuntu 14.04, tôi gặp lỗigetXuser: command not found
rubo77

1

Một phần mở rộng cho câu trả lời của Gilles là cách tìm tệp cookie. Một cách để làm điều đó có thể là sau khi bạn đặt DISPLAYbiến môi trường (như được mô tả bởi Gilles), sử dụng straceđể tìm xhostquyền truy cập tệp . Tôi có thể nghĩ về một cái gì đó như thế này trong BASH:

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

Đầu ra từ mã ở trên sẽ trông như sau:

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

Như bạn có thể thấy rõ, tệp cookie sẽ trực tiếp xuất hiện ở đây.


0

Trong nghiên cứu tìm kiếm một cách thanh lịch để hiển thị tác vụ GUI hoặc X từ môi trường hạn chế như quy tắc udev hoặc từ siêu người dùng, gần đây tôi đã tạo ra một công cụ để phù hợp với nó ( để biết thêm chi tiết ).

xpub là một tập lệnh shell để lấy các biến của môi trường hiển thị X liên quan đến TTY hiện tại hoặc TTY cụ thể.

Đây là một ví dụ với quy tắc udev:

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

$env{ENV}: nếu người dùng hiện tại khởi động X, nếu không hãy xóa nó.

Nguyên tắc là giống nhau cho một dòng lệnh sử dụng export:

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

1
Tôi đề nghị bạn làm cho rõ ràng rằng bạn là tác giả của tập lệnh xpub này.
Dmitry Grigoryev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.