¿Cómo puedo ejecutar un script durante el cierre de sesión de GNOME si no tengo privilegios de administrador?

18

Quiero ejecutar un script antes de cerrar sesión en mi sesión de GNOME, para advertirme si he olvidado un pendrive conectado a la máquina.

Sin embargo, todas las soluciones que he encontrado no han sido suficientes para mí:

  • Esta pregunta similar sugiere editar el /etc/gdm/PostSession/Defaultarchivo, pero no tengo los permisos para hacerlo. (Y el archivo está actualmente vacío en mi máquina, por lo que no hay ganchos existentes para aprovechar)

  • También encontré que esta publicación sugiere una solución, pero, según la primera respuesta, no funciona si apago la computadora en lugar de solo cerrar sesión.

hugomg
fuente
Relacionado, para Unity: Ejecución de scripts al cerrar la sesión del usuario (usuario no root)
Gilles 'SO- deja de ser malvado'

Respuestas:

7

Como está utilizando Gnome, puede usar el script de Python a continuación, adaptado del que mencionó.

Necesita un cierre de sesión de Gnome (es decir gnome-session-quit) (o apagado de gnome), el que ocurre cuando usamos el cierre de sesión en la GUI. AFAIK ningún proceso puede bloquear un apagado por el comando sudo shutdown -h 0o por sudo poweroff. Cuando shutdownse ejecuta, le da SIGTERM a todos los procesos y les da unos segundos para que salgan (después de ejecutar algunos scripts que no pueden ser editados por usuarios no root). Si no se sale, SIGKILL mata por la fuerza los procesos.

Este es el procedimiento paso a paso del gnome_save_yourselfmétodo. Hagamos una prueba

  1. Guarde el siguiente código como ~/Desktop/execute_script_on_shutdown.sh (De 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. Hazlo ejecutable:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Guarde lo siguiente como ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Ejecute el script principal

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Ahora sientes que el guión espera algo

  1. Cerrar sesión o apagar su sistema operativo (Ubuntu)
  2. Iniciar sesión
  3. Busque un archivo con nombre AAAAAAAAAAAAAAAAAAAAAAAAAAAen su escritorio.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Si ve el archivo, todo está bien. Ahora puede editar el shutdown_script.shpara satisfacer sus necesidades. También recuerde ejecutar el execute_script_on_shutdown.shinicio de sesión (o hacerlo ejecutable automáticamente al inicio).

totti
fuente
1

Si desea que su sesión se bloquee en todas las circunstancias, necesita privilegios de root. No hay forma de evitar eso. La raíz del usuario siempre puede kill -9sus procesos. Me sorprende que un apagado no haga que gnome emita la señal de "sálvate a ti mismo". También creo que las secuencias de comandos "PostSession" solo se ejecutan después de que gnome-session ha terminado y (creo) justo antes de que Xserver finalice, lo que significa que ese no es el lugar donde querría poner una advertencia que se supone que aparecerá en la pantalla (si Estoy en lo correcto).

Lo que puede funcionar es una aplicación Gnome que a) reacciona en el evento gnome "sálvese" Y b) reacciona en SIGTERM de la misma manera que reacciona a "salvarse". Más allá de eso, hay poco que pueda hacer, especialmente sin privilegios de root.

Sin embargo, puede resolver el problema no root: escriba un script PostSession que haga lo que quiera y sugiera a alguien con privilegios de root que lo implemente en todas las máquinas, ya que es una herramienta sensata que ayuda mucho a los usuarios. Por lo general, a los chicos con privilegios de root se les paga para hacer / mantener felices a los usuarios. :-)

¿Cuál es el problema que estás tratando de resolver? ¿Por qué no puede cerrar la sesión de su sesión cuando se conecta un pendrive?

Puede tener un cliente dbus que muestre "¡No olvide desconectar el dispositivo!" cuando gvfs anuncia el desmontaje de un sistema de archivos en un dispositivo USB. Pero no sé qué tan bien funciona o incluso sirve a sus propósitos.

Bananguin
fuente
Esto es para mi cuenta en el laboratorio de computación; Si olvido que mi pendrive está enchufado cuando salgo, puedo dejarlo sonando cuando me vaya a casa. Esta es también la razón por la que no tengo privilegios de root (y desafortunadamente pedirles algo a los administradores aquí es un proceso muy burocrático). ¿Qué tendría que hacer para hacer un cliente de dbus como dijiste? Nunca trabajé con algo como esto y no puedo encontrar ninguna documentación sobre qué mensajes soporta gcfs cuando lo busco.
hugomg
0

Finalmente logré probar el script de Python que mencioné como la segunda opción en mi pregunta. Resulta que hace el trabajo cuando se le pide a cerrar, así, no sólo en el reinicio.

hugomg
fuente