Wie kann ich während der GNOME-Abmeldung ein Skript ausführen, wenn ich keine Administratorrechte habe?

18

Ich möchte ein Skript ausführen, bevor ich mich von meiner GNOME-Sitzung abmelde, um mich zu warnen, wenn ich ein in den Computer eingestecktes Laufwerk vergessen habe.

Alle Lösungen, die ich gefunden habe, haben mir jedoch nicht gereicht:

  • Diese ähnliche Frage schlägt vor, die /etc/gdm/PostSession/DefaultDatei zu bearbeiten , aber ich habe nicht die Berechtigung, dies zu tun. (Und die Datei ist derzeit auf meinem Computer leer, sodass keine Hooks vorhanden sind, die ausgenutzt werden könnten.)

  • Ich fand diesen Beitrag auch als Problemumgehung, aber laut der ersten Antwort funktioniert er nicht, wenn ich den Computer heruntergefahren habe, anstatt mich nur abzumelden.

hugomg
quelle
Verwandte, für Unity: Skriptausführung beim Abmelden des Benutzers (kein Root-Benutzer)
Gilles 'SO - hör auf, böse zu sein'

Antworten:

7

Während Sie Gnome verwenden, können Sie das unten stehende Python-Skript verwenden, das an das von Ihnen erwähnte angepasst ist.

Es benötigt eine Gnome-Abmeldung (dh gnome-session-quit) (oder das Herunterfahren von Gnome), die erfolgt, wenn wir die Abmeldung in der GUI verwenden. AFAIK Kein Prozess kann ein Herunterfahren durch den Befehl sudo shutdown -h 0oder durch blockieren sudo poweroff. Wenn shutdownes ausgeführt wird, gibt es SIGTERM an alle Prozesse und gibt ihnen ein paar Sekunden zum Beenden (nach dem Ausführen einiger Skripte, die nicht von Nicht-Root-Benutzern bearbeitet werden können). Wenn nicht beendet, werden Prozesse von SIGKILL gewaltsam beendet.

Dies ist die schrittweise Vorgehensweise der gnome_save_yourselfMethode. Lass uns einen Test machen.

  1. Speichern Sie den folgenden Code unter ~/Desktop/execute_script_on_shutdown.sh (von 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. Mach es ausführbar:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Speichern Sie Folgendes als ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Führen Sie das Hauptskript aus

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Jetzt spürst du, wie das Drehbuch auf etwas wartet

  1. Melden Sie sich ab oder fahren Sie Ihr Betriebssystem herunter (Ubuntu)
  2. Einloggen
  3. Suchen Sie AAAAAAAAAAAAAAAAAAAAAAAAAAAauf Ihrem Desktop nach einer Datei mit dem Namen .

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Wenn Sie die Datei sehen, ist alles in Ordnung. Nun können Sie das bearbeiten shutdown_script.sh, um es an Ihre Bedürfnisse anzupassen. Denken Sie auch daran, den execute_script_on_shutdown.shOn-Login-Befehl auszuführen (oder ihn beim Start automatisch ausführbar zu machen).

Totti
quelle
1

Wenn Sie möchten, dass Ihre Sitzung unter allen Umständen blockiert wird, benötigen Sie Root-Berechtigungen. Daran führt kein Weg vorbei. Benutzer root kann immer kill -9Ihre Prozesse. Ich bin überrascht, dass ein Herunterfahren nicht dazu führt, dass der Gnom das Signal "Rette dich selbst" ausgibt. Außerdem glaube ich, dass die "PostSession" -Skripte erst nach Beendigung der gnome-session und (glaube ich) kurz vor Beendigung des Xservers ausgeführt werden Ich habe recht).

Was möglicherweise funktioniert, ist eine Gnome-Anwendung, die a) auf das Gnome-Ereignis "save-yourself" reagiert UND b) auf SIGTERM genauso reagiert, wie sie auf "safe-yourself" reagiert. Darüber hinaus können Sie wenig tun, insbesondere ohne Root-Rechte.

Sie können jedoch das Nicht-Root-Problem lösen: Schreiben Sie ein PostSession-Skript, das Ihre Anforderungen erfüllt, und empfehlen Sie es jemandem mit Root-Rechten, um es auf allen Computern bereitzustellen, da es ein sinnvolles Tool ist, das den Benutzern sehr hilft. Normalerweise werden die Leute mit Root-Rechten bezahlt, um die Benutzer glücklich zu machen / zu halten. :-)

Welches Problem möchten Sie lösen? Warum können Sie sich möglicherweise nicht von Ihrer Sitzung abmelden, wenn ein USB-Stick angeschlossen ist?

Sie können einen dbus-Client haben, auf dem "Vergessen Sie nicht, das Gerät abzuziehen!" Angezeigt wird. wenn gvfs das Abmelden eines Dateisystems auf einem USB-Gerät ankündigt. Aber ich weiß nicht, wie gut das funktioniert oder sogar Ihren Zwecken dient.

Bananguin
quelle
Dies geschieht auf mein Konto im Computerraum. Wenn ich vergesse, dass mein pendrive beim Abmelden eingesteckt ist, kann ich es so lassen, wie es ist, wenn ich nach Hause gehe. Dies ist auch der Grund, warum ich keine Root-Rechte besitze (und leider ist es ein sehr bürokratischer Prozess, hier etwas nach den Administratoren zu fragen). Was muss ich tun, um einen dbus-Client wie Sie zu erstellen? Ich habe noch nie mit so etwas gearbeitet und kann keine Dokumentation darüber finden, welche Nachrichten gcfs unterstützt, wenn ich danach suche.
Hugomg
0

Ich habe es endlich geschafft, das Python-Skript zu testen, das ich als zweite Option in meiner Frage erwähnt habe. Es stellt sich heraus, dass dies auch funktioniert, wenn Sie aufgefordert werden, das System herunterzufahren, und nicht nur beim Neustart.

hugomg
quelle