Grafiksel bir programı başka bir kullanıcının masaüstünde root olarak başlatabilir miyim?


39

Bilmem gerektiğini düşündüğüm diğer sorular:

  • X olmayan bir oturumdan? (anlamı root X'e giriş yapmaz)

  • Eğer X'te birden fazla kişi giriş yaptıysa, kimin hangi ekranda olduğunu otomatik olarak tespit edebilir ve böylece uygulamayı başlatmak için hangi ekranı ihtiyaç duyduğumu programlı olarak tespit edebilir miyim?

  • Uygulamayı kullanıcı olarak başlatabilir miyim? (tamam, bu işlemin% 99.999 olduğundan eminim)

  • X grubu kullanıcılarının X'e giriş yaptığını tespit edebilir miyim?


naga_plugged.plSenaryonun udevbitmesine dikkat edin (veya arka planda çatallar), çünkü çıkmasını bekler.
rozcietrzewiacz

teşekkürler Ben naga_plugged.pl son çağırdığı c kodunda daemon (0,0) arayarak bir cini yaptım. Asla yeni olduklarını unix forumları vardı burada. Yeni alanlar yerine hepsini bir site yapmalılar.
over_optimistic

Yanıtlar:


23

Bir kullanıcının masaüstünde bir grafik programı başlatmak için, iki şey bulmanız gerekir: kullanıcının masaüstünde ne olduğunu (adres) ve hangi yetkilendirme çerezini kullanacağınızı (şifre).

Aşağıdaki komut kullanıcının çoğu oturumda oturum açtığını (satır başına bir tane) gösteren yerel göstergeleri listelemelidir:

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

Yetkilendirme çerezini bulmak biraz daha zor. Kullanıcının çerez dosyasını aramanız ~/.Xauthoritygerekir; bu varsayılan olarakdır (tek ihtiyacınız olan çerez dosyasının konumu, çerezleri çıkarmanız gerekmez). Bu birçok sistemde çalışır, ancak hepsi değil; ekran yöneticisine ve nasıl kurulduğuna bağlı ve özellikle Gdm (Ubuntu'da varsayılan) en son baktığım yeri kullanmıyor. Gerçek X çerez dosyasını bulmak için taşınabilir bir yol düşünemiyorum. Öğrenmenin en doğru yolu, X sürecinin karşılığını bulmak ve -authseçeneğin argümanını aramaktır. Başka bir yol o X sunucusunda çalışan bir işlem bulmak ve XAUTHORITYortam değişkenini elde etmektir . Çerez dosyasını bulmakta sorun yaşıyorsanız, bkz.Uzaktaki X ekranında bir pencere açın (neden "Ekran açılamıyor")?

Her iki bilgi parçasına da sahip olduğunuzda, seçilen ekranı DISPLAYortam değişkenine, seçilen X yetkili çerez dosyasını ortam değişkenine koyun XAUTHORITYve siz ayarladınız. Programın hangi kullanıcı olarak çalıştığı önemli değildir; suİsterseniz ile birleştirmek .


"-Auth seçeneğinin argümanını ara" nasıl?
rubo77 16:14

@ rubo77 With psor htopor…
Gilles 'çok kötü'

Tamam, pids=$(pgrep -u $target_user nautilus)ödemeyi alıyor, ve nereye bir -authseçenek koymalıyım ?
rubo77

1
@ rubo77 Hiçbir -authyere bir seçenek koymuyorsunuz . XAUTHORITYOrtam değişkenine ne koyacağınızı bulmak için X sunucu işleminin komut satırında aramanız gerekebilir . Bir müşterinin işlemine sahipseniz, ihtiyacınız olan şey -autho müşterinin XAUTHORITYdeğişkeninin değeri dışında bir şey değildir . Ne yapmaya çalıştığını anlamıyorum. Yeni bir soru sormak isteyebilirsiniz.
Gilles 'SO- şeytan olmayı'


11

Tüm makinelerimde root devre dışı olduğundan tümüyle denemiyorum.

Bir kullanıcının hangi ekranda açık olduğunu bulmak için whokomutu kullanabilirsiniz . Son çıktı sütunu, genellikle kullanıcının oturum açtığı EKRAN'dır. Bunun gibi bir şey yalnızca ekranı kapmak için kullanılabilir (bunu yapmanın çok daha etkili bir yolu olabilir, düzenlemeler yapmaktan çekinmeyin):

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

Sonra o ekranda bir grafik X komutu başlatmak için:

DISPLAY=:0 firefox &

where: 0, ilk komutta bulduğunuz ekranla değiştirilir ve firefox, çalıştırmak istediğiniz herhangi bir komutla değiştirilir. Bunu bir kabuk betiğine koyabilir ve sadece bir değişken kullanabilirsiniz.

Bir sonraki kısım, test etmediğim, ancak neden yapmanın mümkün olmadığını anlamıyorum:

su username -c "DISPLAY=:0 firefox"

X komutunu bu kullanıcı olarak başlatmak için.


1
Kök etkisizleştirildiği için, öğelerin kök olarak çalıştırılmadığı anlamına gelmez;) Aslında bunu kök olarak çalışan bir komut dosyası olarak çalıştırmam gerekiyor.
xenoterracide

@ xenoterracide, doğru. Demek istediğim, mümkün olan her koşulda test edemediğimdi. Yani, onu yalnızca root kullanarak test ettim sudo -ive sonuçların root olarak giriş yaptıktan sonra çalıştırmanın farklı olup olmadığından emin olamadım. :-)
Steven D

Kimi biraz değiştirmek zorunda kaldım. Bu who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ iş gibi görünüyor ...
xenoterracide 4:10

Zaten zincirde awk varken kimse neden grep ve sed kullanıyorsa benden daha fazla.

evet ... "awk öğren" bir süredir yapılacaklar listemde.
Steven D

4

Ne kadar acik yaptigina bakabilirsin. Örneğin, xscreensaver komutları verdiğinde, X veya X oturumunu çalıştıran her kullanıcı için ekranı boşaltır.

Örneğin Ubuntu altında bu dosya ilgili şeyler içeriyor:

/etc/acpi/lid.sh

Bu döngüyü içerir:

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

Özellikle, kod içeride /usr/share/acpi-support/power-funcs. fgconsoleEtkin Linux vt'yi bulmaya çağırır , sonra bu konsolda görüntülenen bir X sunucusunu arar ve kullanıcıyı oradan bulur. Daha sonra ~/.Xauthority, X çerezi olarak kullanır , ki eksik bir şey olmadığı sürece X sunucusuna bağlanamayacağı anlamına gelmez (Ubuntu'nun varsayılan ayarları, gdm kullanarak, X çerezlerini kullanıcının evinde saklamaz) dizin).
Gilles 'SO- kötülük' dur

@Gilles lid.sh örneğin getXconsole'u çağırmaz. Dolayısıyla, fgconsole kullanılmaz. Cevabı, düşündüğüm snippet ile güncelledim. Ve aslında Ubuntu'da da çalışıyor. Kapağı kapattığımda ekran kararıyor.
maxschlepzig

1
getXuser: command not found
Ubuntu 14.04'te

1

Gilles cevabının bir uzantısı, çerez dosyasının nasıl bulunacağıdır. Bunu yapmanın bir yolu, DISPLAYortam değişkenini (Gilles tarafından tanımlandığı gibi) ayarladıktan sonra stracedosya xhosterişimini bulmak için kullanmak olabilir . BASH'da böyle bir şey düşünebilirim:

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

Yukarıdaki kodun çıktısı şöyle görünecektir:

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

Açıkça görebileceğiniz gibi, çerez dosyası doğrudan burada görünecektir.


0

GUI veya X görevini udev kuralları veya süper kullanıcı gibi sınırlı bir ortamdan görüntülemek için zarif bir yol bulma araştırmamda, son zamanlarda buna uygun bir araç geliştirdim ( daha fazla bilgi için ).

xpub X'in mevcut veya verilen TTY ile ilgili değişkenlerini görüntülemesini sağlayan bir kabuk betiğidir.

Bu bir udev kuralı örneğidir:

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

$env{ENV}: current-tty kullanıcısı X başlatırsa, aksi halde kaldırın.

İlke aşağıdakileri kullanan bir komut satırı için aynıdır export:

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

1
Bu xpub betiğinin yazarı olduğunuzu açıkça söylemenizi öneririm.
Dmitry Grigoryev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.