Jak mogę uruchomić skrypt podczas wylogowywania GNOME, jeśli nie mam uprawnień administratora?

18

Chcę uruchomić skrypt przed wylogowaniem się z sesji GNOME, aby ostrzec się, jeśli zapomniałem pendrive podłączonego do maszyny.

Jednak wszystkie znalezione przeze mnie rozwiązania nie były dla mnie wystarczające:

  • To podobne pytanie sugeruje edycję /etc/gdm/PostSession/Defaultpliku, ale nie mam na to uprawnień. (A plik jest obecnie pusty na moim komputerze, więc nie ma żadnych haków, które można by wykorzystać)

  • Znalazłem również ten post sugerujący obejście, ale zgodnie z pierwszą odpowiedzią nie działa, jeśli zamknę komputer zamiast tylko się wyloguję.

hugomg
źródło
Powiązane, dla Unity: Wykonywanie skryptów podczas wylogowywania użytkownika (użytkownik inny niż root)
Gilles „SO- przestań być zły”

Odpowiedzi:

7

Podczas korzystania z Gnome możesz użyć poniższego skryptu Python, dostosowanego do tego, o którym wspomniałeś.

Wymaga wylogowania z Gnome (tj. gnome-session-quit) (Lub wyłączenia gnome), to się dzieje, gdy używamy wylogowania w GUI. AFAIK żaden proces nie może zablokować zamknięcia polecenia sudo shutdown -h 0lub polecenia sudo poweroff. Po shutdownuruchomieniu daje SIGTERM całemu procesowi i daje kilka sekund na zakończenie (po wykonaniu niektórych skryptów, których nie mogą edytować użytkownicy inni niż root). Jeśli nie zostaną zakończone, SIGKILL zabije je w sposób wymuszony.

Jest to gnome_save_yourselfmetoda metody krok po kroku . Zróbmy test.

  1. Zapisz następujący kod jako ~/Desktop/execute_script_on_shutdown.sh (From 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. Spraw, by był wykonywalny:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Zapisz następujące jako ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Uruchom skrypt główny

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Teraz czujesz, że skrypt na coś czeka

  1. Wyloguj się lub zamknij system operacyjny (Ubuntu)
  2. Zaloguj sie
  3. Sprawdź plik o nazwie AAAAAAAAAAAAAAAAAAAAAAAAAAAna pulpicie.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Jeśli widzisz plik, wszystko jest w porządku. Teraz możesz edytować w shutdown_script.shzależności od potrzeb. Pamiętaj także, aby wykonać execute_script_on_shutdown.shlogowanie (lub ustawić automatyczne uruchamianie po uruchomieniu).

Totti
źródło
1

Jeśli chcesz, aby sesja była blokowana w każdych okolicznościach, potrzebujesz uprawnień roota. Nie można tego obejść. Użytkownik root może zawsze mieć kill -9swoje procesy. Dziwi mnie, że wyłączenie nie powoduje, że gnom emituje sygnał „ratuj siebie”. Uważam również, że skrypty „PostSession” są uruchamiane dopiero po zakończeniu sesji gnome i (sądzę) tuż przed zakończeniem Xserver, co oznacza, że ​​nie jest to miejsce, w którym chciałbyś umieścić ostrzeżenie, które powinno pojawić się na ekranie (jeśli Mam rację).

Może działać aplikacja Gnome, która a) reaguje na zdarzenie gnome „ratuj siebie” ORAZ b) reaguje na SIGTERM w taki sam sposób, w jaki reaguje na „bezpieczne”. Poza tym niewiele możesz zrobić, zwłaszcza bez uprawnień roota.

Możesz jednak rozwiązać problem inny niż root: Napisz skrypt PostSession, który robi to, co chcesz i zasugeruj komuś z uprawnieniami roota, aby wdrożył go na wszystkich komputerach, ponieważ jest to rozsądne narzędzie, które bardzo pomaga użytkownikom. Zwykle faceci z uprawnieniami root są opłacani, aby uszczęśliwiać użytkowników. :-)

Jaki problem próbujesz rozwiązać? Dlaczego nie możesz wylogować się z sesji, gdy pendrive jest podłączony?

Możesz mieć klienta dbus, który wyświetla „Nie zapomnij odłączyć urządzenia!” kiedy gvfs ogłasza odmontowanie systemu plików na urządzeniu USB. Ale nie wiem, jak dobrze to działa, a nawet służy twoim celom.

Bananguin
źródło
To jest dla mojego konta w pracowni komputerowej; Jeśli zapomnę, że mój pendrive jest podłączony, gdy się wylogowuję, mogę zostawić go w spokoju, gdy wracam do domu. Dlatego też nie mam przywilejów rootowania (a niefortunne proszenie o to tutaj administratorów jest procesem bardzo biurokratycznym). Co musiałbym zrobić, aby utworzyć klienta dbus, tak jak powiedziałeś? Nigdy nie pracowałem z czymś takim i nie mogę znaleźć żadnej dokumentacji na temat tego, jakie wiadomości obsługuje gcfs podczas wyszukiwania.
hugomg
0

W końcu udało mi się przetestować skrypt Pythona, o którym wspomniałem jako drugą opcję w moim pytaniu. Okazuje się, że to nie działa, gdy z prośbą o wyłączenie, a także, nie tylko podczas ponownego uruchamiania.

hugomg
źródło