Bisakah saya meluncurkan program grafis di desktop pengguna lain sebagai root?

39

Berikut ini adalah pertanyaan lain yang saya pikir perlu saya ketahui:

  • Dari Sesi non X? (artinya root tidak masuk ke X)

  • Jika beberapa orang masuk pada X, bisakah saya mendeteksi secara otomatis siapa yang berada di layar mana, dan dengan demikian secara program mendeteksi layar mana yang saya perlukan untuk meluncurkan aplikasi?

  • Bisakah saya meluncurkan aplikasi sebagai pengguna? (ok saya 99,999% yakin ini adalah ya)

  • Bisakah saya mendeteksi jika pengguna grup X masuk ke X?

xenoterracide
sumber
Berhati-hatilah bahwa naga_plugged.plskrip selesai (atau bercabang di latar), karena udevakan menunggu keluar
rozcietrzewiacz
terima kasih saya menjadikannya daemon dengan memanggil daemon (0,0) dalam kode c yang terakhir dipanggil naga_plugged.pl. Saya tidak pernah baru mereka memiliki forum unix di sini. Mereka harus menjadikannya semua satu situs, bukan domain baru.
over_optimistic

Jawaban:

23

Untuk meluncurkan program grafis pada desktop pengguna, Anda perlu menemukan dua hal: tampilan apa yang digunakan desktop (alamat) dan cookie otorisasi apa yang digunakan (kata sandi).

Perintah berikut harus mencantumkan tampilan lokal tempat pengguna masuk (satu per baris) di sebagian besar unices:

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

Menemukan cookie otorisasi sedikit lebih sulit. Anda harus mencari file cookie pengguna, yang secara ~/.Xauthoritydefault (semua yang Anda butuhkan adalah lokasi file cookie, Anda tidak perlu mengekstrak cookie dari itu). Itu bekerja pada banyak sistem, tetapi tidak semua; itu tergantung pada manajer tampilan dan bagaimana pengaturannya, dan khususnya Gdm (default pada Ubuntu) tidak menggunakan lokasi default terakhir yang saya lihat. Saya tidak bisa memikirkan cara portabel untuk mengetahui file cookie X yang sebenarnya. Cara paling akurat untuk mengetahuinya adalah dengan mengetahui pid dari proses X dan mencari argumen untuk -authopsi tersebut. Cara lain adalah dengan menemukan proses yang berjalan pada server X itu dan ambil XAUTHORITYvariabel environmentemnt -nya . Jika Anda kesulitan menemukan file cookie, lihatBuka jendela pada tampilan X jarak jauh (mengapa "Tidak bisa membuka layar")?

Setelah Anda memiliki kedua informasi, letakkan tampilan yang dipilih dalam DISPLAYvariabel lingkungan, file cookie otoritas X yang dipilih dalam XAUTHORITYvariabel lingkungan, dan Anda siap. Tidak masalah apa pengguna menjalankan program; kombinasikan dengan sujika Anda suka.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bagaimana Anda "mencari argumen ke opsi -auth"?
rubo77
@ rubo77 Dengan psatau htop...
Gilles 'SO- berhenti bersikap jahat'
OK, begitu pids=$(pgrep -u $target_user nautilus)mendapat pid, dan di mana saya harus meletakkan -authopsi?
rubo77
1
@ rubo77 Anda tidak menempatkan -authopsi di mana pun. Anda mungkin perlu mencarinya di baris perintah proses server X untuk mengetahui apa yang harus dimasukkan ke dalam XAUTHORITYvariabel lingkungan. Jika Anda memiliki proses klien, yang Anda butuhkan bukanlah apa-apa -authselain nilai XAUTHORITYvariabel klien itu . Saya tidak mengerti apa yang Anda coba lakukan. Anda mungkin ingin mengajukan pertanyaan baru.
Gilles 'SANGAT berhenti menjadi jahat'
Saya mencoba menggunakan informasi Anda di sini untuk menyelesaikan cara Membuat pemberitahuan di layar yang diprakarsai oleh root
rubo77
11

Saya tidak dapat sepenuhnya mencoba ini karena semua mesin saya telah dinonaktifkan root.

Untuk menemukan tampilan pengguna yang aktif, Anda dapat menggunakan whoperintah. Kolom keluaran terakhir biasanya DISPLAY tempat pengguna masuk. Sesuatu seperti ini dapat digunakan untuk mengambil hanya tampilan (kemungkinan ada cara yang jauh lebih efisien untuk melakukan ini, jangan ragu untuk menawarkan suntingan):

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

Kemudian untuk meluncurkan perintah X grafis pada tampilan itu:

DISPLAY=:0 firefox &

di mana: 0 akan diganti dengan tampilan apa pun yang Anda temukan di perintah pertama dan firefox akan diganti dengan perintah apa pun yang ingin Anda jalankan. Anda bisa meletakkan ini dalam skrip shell dan cukup gunakan variabel.

Bagian selanjutnya adalah bagian yang belum saya uji, tetapi saya tidak melihat mengapa itu tidak mungkin dilakukan:

su username -c "DISPLAY=:0 firefox"

untuk meluncurkan perintah X sebagai pengguna itu.

Steven D
sumber
1
Hanya karena root dinonaktifkan bukan berarti hal-hal tidak dijalankan sebagai root;) Saya sebenarnya perlu menjalankan ini sebagai skrip yang berjalan sebagai root.
xenoterracide
@ xenoterracide, benar. Yang saya maksudkan adalah bahwa saya tidak dapat mengujinya dalam semua keadaan yang memungkinkan. Yaitu, saya hanya mengujinya sebagai menggunakan root sudo -idan tidak bisa memastikan apakah hasilnya akan berbeda daripada menjalankannya setelah masuk sebagai root secara langsung. :-)
Steven D
Saya harus memodifikasi yang sedikit. Ini who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ sepertinya berhasil ...
xenoterracide
mengapa ada orang yang menggunakan grep dan sed ketika sudah ada awk dalam rantai itu di luar saya.
ya ... "pelajari awk" telah ada di daftar todo saya untuk sementara waktu sekarang.
Steven D
4

Anda bisa melihat bagaimana acpid melakukannya. Misalnya ketika mengeluarkan perintah xscreensaver atau mengosongkan layar untuk setiap pengguna yang menjalankan sesi X atau X.

Misalnya di bawah Ubuntu file ini berisi hal-hal terkait:

/etc/acpi/lid.sh

Berisi loop ini:

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
maxschlepzig
sumber
Secara khusus, kode ini di /usr/share/acpi-support/power-funcs. Ini panggilan fgconsoleuntuk menemukan Linux vt aktif, kemudian mencari server X yang ditampilkan pada konsol ini, dan mencari tahu pengguna dari sana. Kemudian ia digunakan ~/.Xauthoritysebagai cookie X, yang kecuali ada sesuatu yang saya lewatkan berarti itu tidak akan benar-benar dapat terhubung ke server X (pengaturan default Ubuntu, menggunakan gdm, tidak menyimpan cookie X di rumah pengguna) direktori).
Gilles 'SO- stop being evil'
@Gilles lid.sh misalnya tidak memanggil getXconsole. Jadi, fgconsole tidak digunakan. Saya memperbarui jawabannya dengan cuplikan yang ada dalam pikiran saya. Dan itu benar-benar berfungsi di Ubuntu. Layar kosong ketika saya menutup tutupnya.
maxschlepzig
1
Di ubuntu 14.04 saya mendapatkan kesalahangetXuser: command not found
rubo77
1

Ekstensi untuk jawaban Gilles adalah bagaimana menemukan file cookie. Salah satu cara untuk melakukannya mungkin setelah Anda mengatur DISPLAYvariabel lingkungan (seperti dijelaskan oleh Gilles), gunakan straceuntuk menemukan xhostakses file . Saya dapat memikirkan sesuatu seperti ini di BASH:

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

Output dari kode di atas akan terlihat seperti:

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

Seperti yang Anda lihat dengan jelas, file cookie akan langsung muncul di sini.

Bichoy
sumber
0

Dalam penelitian saya untuk menemukan cara yang elegan untuk menampilkan tugas GUI atau X dari lingkungan terbatas seperti aturan udev atau dari pengguna super, saya baru-baru ini membuat alat yang sesuai dengan itu ( untuk lebih jelasnya ).

xpub adalah skrip shell untuk mendapatkan variabel lingkungan tampilan X mengenai TTY saat ini atau yang diberikan.

Ini adalah contoh dengan aturan udev:

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

$env{ENV}: jika pengguna saat ini memulai X, jika tidak hapuslah.

Prinsipnya sama untuk baris perintah menggunakan export:

export $(xpub) ; su ${XUSER} -c 'notify-send Hello'
Thomas Venries
sumber
1
Saya sarankan Anda membuatnya sangat jelas bahwa Anda adalah penulis skrip xpub ini.
Dmitry Grigoryev