Comment puis-je exécuter un script pendant la déconnexion GNOME si je n'ai pas de privilèges d'administrateur?

18

Je veux exécuter un script avant de me déconnecter de ma session GNOME, pour m'avertir si j'ai oublié une clé USB branchée sur la machine.

Cependant, toutes les solutions que j'ai trouvées ne me suffisent pas:

  • Cette question similaire suggère de modifier le /etc/gdm/PostSession/Defaultfichier, mais je n'ai pas les autorisations pour le faire. (Et le fichier est actuellement vide sur ma machine, donc il n'y a pas de hooks existants pour en profiter)

  • J'ai également trouvé ce message suggérant une solution de contournement mais, selon la première réponse, cela ne fonctionne pas si j'arrête l'ordinateur au lieu de me déconnecter uniquement.

hugomg
la source
Connexes, pour Unity: exécution de script à la déconnexion de l'utilisateur (non root)
Gilles 'SO- arrête d'être mauvais'

Réponses:

7

Comme vous utilisez Gnome, vous pouvez utiliser le script Python ci-dessous, adapté de celui que vous avez mentionné.

Il a besoin d'une déconnexion Gnome (ie gnome-session-quit) (ou d'un arrêt gnome), celui qui se produit lorsque nous utilisons la déconnexion dans l'interface graphique. AFAIK aucun processus ne peut bloquer un arrêt par la commande sudo shutdown -h 0ou par sudo poweroff. Lorsqu'il shutdownest exécuté, il donne SIGTERM à tous les processus et leur donne quelques secondes pour quitter (après avoir exécuté certains scripts qui ne peuvent pas être modifiés par des utilisateurs non root). Si ce n'est pas le cas, les processus sont tués par SIGKILL.

C'est la procédure étape par étape de la gnome_save_yourselfméthode. Faisons un test.

  1. Enregistrez le code suivant sous ~/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. Rendez-le exécutable:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Enregistrez les éléments suivants sous ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Exécutez le script principal

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Maintenant, vous sentez que le script attend quelque chose

  1. Déconnectez-vous ou arrêtez votre système d'exploitation (Ubuntu)
  2. S'identifier
  3. Recherchez un fichier nommé AAAAAAAAAAAAAAAAAAAAAAAAAAAsur votre bureau.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Si vous voyez le fichier, tout est OK. Vous pouvez maintenant modifier le shutdown_script.shpour l'adapter à vos besoins. N'oubliez pas non plus d'exécuter la execute_script_on_shutdown.shconnexion (ou de la rendre exécutable automatiquement au démarrage).

totti
la source
1

Si vous voulez que votre session se bloque en toutes circonstances, vous avez besoin des privilèges root. Il n'y a aucun moyen de contourner cela. La racine utilisateur peut toujours kill -9vos processus. Je suis surpris qu'un arrêt ne fasse pas émettre par le gnome le signal "sauve-toi toi-même". Je pense également que les scripts "PostSession" ne sont exécutés qu'après la fin de gnome-session et (je crois) juste avant la fin de Xserver, ce qui signifie que ce n'est pas l'endroit où vous souhaitez afficher un avertissement qui devrait apparaître à l'écran (si J'ai bon).

Ce qui peut fonctionner, c'est une application Gnome qui a) réagit à l'événement gnome «sauvez-vous» ET b) réagit sur SIGTERM de la même manière qu'il réagit à «vous-même». Au-delà de cela, vous ne pouvez pas faire grand-chose, en particulier sans privilèges root.

Cependant, vous pouvez résoudre le problème non root: écrivez un script PostSession qui fait ce que vous voulez et suggérez à quelqu'un avec des privilèges root de le déployer sur toutes les machines car c'est un outil sensé qui aide beaucoup les utilisateurs. Habituellement, les gars avec des privilèges root sont payés pour rendre / garder les utilisateurs heureux. :-)

Quel est le problème que vous essayez de résoudre? Pourquoi ne pas vous déconnecter de votre session quand une clé USB est branchée?

Vous pouvez avoir un client dbus qui affiche "N'oubliez pas de débrancher l'appareil!" lorsque gvfs annonce le démontage d'un système de fichiers sur un périphérique USB. Mais je ne sais pas si cela fonctionne ou sert même vos objectifs.

Bananguin
la source
Ceci est pour mon compte au laboratoire informatique; Si j'oublie ma clé USB branchée lorsque je me déconnecte, je peux la laisser derrière quand je rentre chez moi. C'est aussi pourquoi je n'ai pas de privilèges root (et malheureusement, demander quoi que ce soit aux administrateurs ici est un processus très bururocratique). Que devrais-je faire pour créer un client dbus comme vous l'avez dit? Je n'ai jamais travaillé avec quelque chose comme ça et je ne trouve aucune documentation sur les messages pris en charge par gcfs lorsque je le recherche.
hugomg
0

J'ai finalement réussi à tester le script Python que j'ai mentionné comme deuxième option dans ma question. Il se trouve qu'il fait le travail en demandant de fermer aussi bien, et pas seulement au redémarrage.

hugomg
la source