Bagaimana saya bisa menjalankan skrip saat logout GNOME jika saya tidak memiliki hak admin?

18

Saya ingin menjalankan skrip sebelum saya keluar dari sesi GNOME saya, untuk memperingatkan diri saya sendiri jika saya lupa sebuah pendrive dicolokkan ke mesin.

Namun, semua solusi yang saya temukan belum cukup untuk saya:

  • Pertanyaan serupa ini menyarankan untuk mengedit /etc/gdm/PostSession/Defaultfile, tetapi saya tidak memiliki izin untuk melakukan itu. (Dan file saat ini kosong di mesin saya, jadi tidak ada kait yang ada untuk mengambil keuntungan dari)

  • Saya juga menemukan posting ini menyarankan solusi tetapi, menurut jawaban pertama, itu tidak berfungsi jika saya mematikan komputer alih-alih hanya log off.

hugomg
sumber
Terkait, untuk Persatuan: Eksekusi Skrip saat logout pengguna (bukan pengguna root)
Gilles 'SO- stop being evil'

Jawaban:

7

Saat Anda menggunakan Gnome, Anda dapat menggunakan skrip Python di bawah ini, yang diadaptasi dari yang Anda sebutkan.

Perlu logout Gnome (yaitu gnome-session-quit) (atau shutdown gnome), yang terjadi ketika kita menggunakan logout di GUI. AFAIK tidak ada proses yang dapat memblokir shutdown dengan perintah sudo shutdown -h 0atau oleh sudo poweroff. Ketika shutdowndieksekusi memberikan SIGTERM ke semua proses dan memberikan beberapa detik kepada mereka untuk keluar (Setelah menjalankan beberapa skrip yang tidak dapat diedit oleh pengguna non root). Jika tidak keluar proses akan dibunuh dengan paksa oleh SIGKILL.

Ini adalah langkah demi langkah prosedur gnome_save_yourselfmetode. Ayo lakukan tes.

  1. Simpan kode berikut sebagai ~/Desktop/execute_script_on_shutdown.sh (Dari http://www.linuxquestions.org/questions/linux-desktop-74/gnome-run-script-on-logout-724453/#post3560301 )

    #!/usr/bin/env python
    
    #Author: Seamus Phelan
    
    #This program runs a custom command/script just before gnome shuts 
    #down.  This is done the same way that gedit does it (listening for 
    #the 'save-yourself' event).  This is different to placing scipts 
    #in /etc/rc#.d/ as the script will be run before gnome exits.
    #If the custom script/command fails with a non-zero return code, a 
    #popup dialog box will appear offering the chance to cancel logout
    #
    #Usage: 1 - change the command in the 'subprocess.call' in 
    #           function 'session_save_yourself' below to be what ever
    #           you want to run at logout.
    #       2 - Run this program at every gnome login (add via menu System 
    #           -> Preferences -> Session)
    # 
    #
    
    import sys
    import subprocess
    import datetime
    
    import gnome
    import gnome.ui
    import gtk
    
    
    class Namespace: pass
    ns = Namespace()
    ns.dialog = None
    
    
    def main():
        prog = gnome.init ("gnome_save_yourself", "1.0", gnome.libgnome_module_info_get(), sys.argv, [])
        client = gnome.ui.master_client()
        #set up call back for when 'logout'/'Shutdown' button pressed
        client.connect("save-yourself", session_save_yourself)
        client.connect("shutdown-cancelled", shutdown_cancelled)
    
    
    def session_save_yourself( *args):
            #Lets try to unmount all truecrypt volumes
    
    
        #execute shutdowwn script
        #########################################################################################
        retcode = subprocess.call("bash /home/totti/Desktop/shutdown_script.sh", shell=True)
        ##########################################################################################
        if retcode != 0:
            #command failed  
            show_error_dialog()
        return True
    
    def shutdown_cancelled( *args):
        if ns.dialog != None:
            ns.dialog.destroy()
        return True
    
    
    def show_error_dialog():
        ns.dialog = gtk.Dialog("There was a problem running your pre-shutdown script",
                               None,
                               gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                               ("There was a problem running your pre-shutdown script - continue logout", gtk.RESPONSE_ACCEPT))
        if ns.test_mode == True:
            response = ns.dialog.run()
            ns.dialog.destroy()
        else:
            #when in shutdown mode gnome will only allow you to open a window using master_client().save_any_dialog()
            #It also adds the 'Cancel logout' button
            gnome.ui.master_client().save_any_dialog(ns.dialog)
    
    
    
    #Find out if we are in test mode???
    if len(sys.argv) >=2 and sys.argv[1] == "test":
        ns.test_mode = True
    else:
        ns.test_mode = False
    
    if ns.test_mode == True:
        main()
        session_save_yourself()
    else:
        main()
        gtk.main() 
    
  2. Jadikan itu dapat dieksekusi:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Simpan yang berikut sebagai ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Jalankan skrip utama

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Sekarang Anda merasakan skrip menunggu sesuatu

  1. Logout atau matikan OS Anda (Ubuntu)
  2. Gabung
  3. Periksa file bernama AAAAAAAAAAAAAAAAAAAAAAAAAAAdi desktop Anda.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Jika Anda melihat file semuanya OK. Sekarang Anda dapat mengedit shutdown_script.shsesuai dengan kebutuhan Anda. Juga ingat untuk menjalankan execute_script_on_shutdown.shlogin saat ini (atau membuatnya otomatis dieksekusi pada saat startup).

totti
sumber
1

Jika Anda ingin sesi Anda diblokir dalam semua keadaan, Anda memerlukan hak akses root. Tidak ada jalan lain untuk itu. Root pengguna selalu dapat kill -9memproses Anda. Saya terkejut bahwa shutdown tidak membuat gnome memancarkan sinyal "save-yourself". Juga saya percaya skrip "PostSession" hanya berjalan setelah sesi gnome telah berakhir dan (saya percaya) tepat sebelum Xserver berakhir, artinya itu bukan tempat di mana Anda ingin menaruh peringatan yang seharusnya muncul di layar (jika Saya benar).

Apa yang mungkin berhasil adalah aplikasi Gnome yang a) bereaksi pada peristiwa gnome "save-yourself" DAN b) bereaksi pada SIGTERM dengan cara yang sama ia bereaksi terhadap "safe-yourself". Selain itu ada sedikit yang bisa Anda lakukan, terutama tanpa hak root.

Namun Anda dapat mengatasi masalah non-root: Tulis skrip PostSession yang melakukan apa yang Anda inginkan dan sarankan kepada seseorang dengan hak akses root untuk menyebarkannya di semua mesin karena itu adalah alat yang masuk akal yang membantu banyak pengguna. Biasanya orang-orang dengan hak akses root dibayar untuk membuat / membuat pengguna senang. :-)

Apa masalah yang Anda coba selesaikan? Mengapa Anda tidak bisa keluar dari sesi Anda ketika pendrive dicolokkan?

Anda dapat memiliki klien dbus yang menampilkan "Jangan lupa mencabut perangkat!" ketika gvfs mengumumkan pelepasan sistem file pada perangkat USB. Tetapi saya tidak tahu seberapa baik itu bekerja atau bahkan melayani tujuan Anda.

Bananguin
sumber
Ini untuk akun saya di lab komputer; Jika saya lupa flashdisk saya terhubung ketika saya logout, saya bisa membiarkannya menyala saat saya pulang. Ini juga mengapa saya tidak memiliki hak akses root (dan sayangnya meminta sesuatu untuk admin di sini adalah proses yang sangat birokratis). Apa yang harus saya lakukan untuk membuat klien dbus seperti yang Anda katakan? Saya tidak pernah bekerja dengan sesuatu seperti ini dan saya tidak dapat menemukan dokumentasi tentang memberi tahu pesan apa yang didukung gcf ketika saya mencarinya.
hugomg
0

Saya akhirnya berhasil benar-benar menguji skrip Python yang saya sebutkan sebagai opsi kedua dalam pertanyaan saya. Ternyata hal itu tidak bekerja ketika meminta untuk ditutup juga, bukan hanya di reboot.

hugomg
sumber