Come posso eseguire uno script durante il logout di GNOME se non ho i privilegi di amministratore?


18

Voglio eseguire uno script prima di disconnettermi dalla mia sessione GNOME, per avvisarmi se ho dimenticato un pendrive collegato alla macchina.

Tuttavia, tutte le soluzioni che ho trovato non sono state sufficienti per me:

  • Questa domanda simile suggerisce di modificare il /etc/gdm/PostSession/Defaultfile, ma non ho i permessi per farlo. (E il file è attualmente vuoto sulla mia macchina, quindi non ci sono hook esistenti da sfruttare)

  • Ho anche trovato questo post che suggerisce una soluzione alternativa ma, secondo la prima risposta, non funziona se spengo il computer invece di disconnettermi.


Risposte:


7

Mentre usi Gnome, puoi usare lo script Python di seguito, adattato da quello che hai citato.

Ha bisogno di un logout di Gnome (cioè gnome-session-quit) (o di gnome shutdown), quello accade quando usiamo il logout nella GUI. AFAIK nessun processo può bloccare un arresto dal comando sudo shutdown -h 0o da sudo poweroff. Quando shutdownviene eseguito, dà SIGTERM a tutto il processo e concede alcuni secondi per uscire (dopo aver eseguito alcuni script che non possono essere modificati da utenti non root). In caso contrario, i processi vengono uccisi forzatamente da SIGKILL.

Questa è la procedura passo per passo del gnome_save_yourselfmetodo. Facciamo un test.

  1. Salva il seguente codice come ~/Desktop/execute_script_on_shutdown.sh (Da 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. Renderlo eseguibile:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Salva quanto segue come ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Esegui lo script principale

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Ora senti che la sceneggiatura aspetta qualcosa

  1. Disconnettersi o spegnere il sistema operativo (Ubuntu)
  2. Accesso
  3. Verifica la presenza di un file denominato AAAAAAAAAAAAAAAAAAAAAAAAAAAsul desktop.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Se vedi il file tutto OK. Ora puoi modificarlo shutdown_script.shin base alle tue necessità. Ricorda inoltre di eseguire il execute_script_on_shutdown.shlogin all'accesso (o renderlo eseguibile automaticamente all'avvio).


1

Se si desidera bloccare la sessione in tutte le circostanze, sono necessari i privilegi di root. Non c'è modo di aggirare questo. L'utente root può sempre i kill -9tuoi processi. Sono sorpreso che un arresto non faccia emettere allo gnomo il segnale "salva te stesso". Inoltre credo che gli script "PostSession" vengano eseguiti solo dopo che gnome-session è terminata e (credo) poco prima della chiusura di Xserver, il che significa che non è il luogo in cui si vorrebbe mettere un avviso che dovrebbe apparire sullo schermo (se Ho ragione).

Ciò che può funzionare è un'applicazione Gnome che a) reagisce all'evento gnome "salva te stesso" AND b) reagisce su SIGTERM nello stesso modo in cui reagisce al "sicuro te stesso". Oltre a ciò c'è poco che puoi fare, soprattutto senza i privilegi di root.

Tuttavia, puoi risolvere il problema non root: Scrivi uno script PostSession che fa quello che vuoi e suggerisci a qualcuno con i privilegi di root di distribuirlo su tutte le macchine in quanto è uno strumento sensato che aiuta molto gli utenti. Di solito i ragazzi con privilegi di root sono pagati per rendere / mantenere felici gli utenti. :-)

Qual è il problema che stai cercando di risolvere? Perché non è possibile disconnettersi dalla sessione quando è collegato un pendrive?

Puoi avere un client dbus che visualizza "Non dimenticare di scollegare il dispositivo!" quando gvfs annuncia lo smontaggio di un filesystem su un dispositivo USB. Ma non so quanto funzioni bene o serva anche ai tuoi scopi.


Questo è per il mio account al laboratorio informatico; Se dimentico il mio pendrive collegato quando eseguo il logout, posso lasciarlo essere quando torno a casa. Questo è anche il motivo per cui non ho i privilegi di root (e sfortunatamente chiedere qualcosa agli amministratori qui è un processo molto bureocratico). Cosa dovrei fare per creare un client dbus come hai detto? Non ho mai lavorato con qualcosa del genere e non riesco a trovare alcuna documentazione che indichi quali messaggi supporta gcfs quando lo cerco.
hugomg,

0

Sono finalmente riuscito a testare effettivamente lo script Python che ho citato come seconda opzione nella mia domanda. Si scopre che si fa il lavoro quando si chiede di chiudere così, non solo al riavvio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.