Como posso executar um script durante o logout do GNOME se não tenho privilégios de administrador?

18

Quero executar um script antes de sair da minha sessão do GNOME, para me avisar se esqueci um pendrive conectado à máquina.

No entanto, todas as soluções que encontrei não foram suficientes para mim:

  • Essa pergunta semelhante sugere a edição do /etc/gdm/PostSession/Defaultarquivo, mas não tenho permissões para fazer isso. (No momento, o arquivo está vazio na minha máquina, portanto, não há ganchos existentes para tirar vantagem)

  • Também encontrei esta postagem sugerindo uma solução alternativa, mas, de acordo com a primeira resposta, ela não funcionará se eu desligar o computador em vez de apenas fazer logoff.

hugomg
fonte
Relacionado, para Unity: Execução de script no logout do usuário (usuário não root)
Gilles 'SO- stop be evil'

Respostas:

7

Como você está usando o Gnome, você pode usar o script Python abaixo, adaptado do que você mencionou.

Ele precisa de um logout do Gnome (ie gnome-session-quit) (ou desligamento do gnome), o que acontece quando usamos o logout na GUI. AFAIK nenhum processo pode bloquear um desligamento pelo comando sudo shutdown -h 0ou por sudo poweroff. Quando shutdowné executado, ele fornece ao SIGTERM todos os processos e alguns segundos para eles saírem (depois de executar alguns scripts que não podem ser editados por usuários não-root). Caso contrário, os processos encerrados são extintos pela SIGKILL.

Este é o procedimento passo a passo do gnome_save_yourselfmétodo. Vamos fazer um teste.

  1. Salve o código a seguir como ~/Desktop/execute_script_on_shutdown.sh (em 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. Torne executável:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Salve o seguinte como ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Execute o script principal

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Agora você sente que o script espera por algo

  1. Sair ou desligar o sistema operacional (Ubuntu)
  2. Conecte-se
  3. Verifique se há um arquivo nomeado AAAAAAAAAAAAAAAAAAAAAAAAAAAna sua área de trabalho.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Se você vir o arquivo tudo bem. Agora você pode editar o shutdown_script.shpara atender às suas necessidades. Lembre-se também de executar o execute_script_on_shutdown.shlogin (ou torná-lo executável automaticamente na inicialização).

totti
fonte
1

Se você deseja que sua sessão seja bloqueada em todas as circunstâncias, você precisa de privilégios de root. Não há maneira de contornar isso. A raiz do usuário pode sempre kill -9seus processos. Estou surpreso que um desligamento não faça o gnomo emitir o sinal "salve a si mesmo". Também acredito que os scripts "PostSession" são executados somente após o término do gnome-session e (acredito) logo antes do Xserver terminar, o que significa que não é o lugar em que você deseja colocar um aviso que deve aparecer na tela (se Estou correto).

O que pode funcionar é um aplicativo Gnome que: a) reage ao evento do gnomo "salve a si mesmo"; b) reage ao SIGTERM da mesma maneira que reage ao "salvaguarda". Além disso, há pouco que você pode fazer, especialmente sem privilégios de root.

No entanto, você pode resolver o problema não raiz: Escreva um script PostSession que faça o que você deseja e sugira a alguém com privilégios de root para implantá-lo em todas as máquinas, pois é uma ferramenta sensata que ajuda muito os usuários. Normalmente, os caras com privilégios de root são pagos para fazer / manter os usuários felizes. :-)

Qual é o problema que você está tentando resolver? Por que você não pode sair da sua sessão quando um pendrive é conectado?

Você pode ter um cliente dbus que exibe "Não se esqueça de desconectar o dispositivo!" quando o gvfs anuncia a desmontagem de um sistema de arquivos em um dispositivo USB. Mas eu não sei o quão bem isso funciona ou serve a seus propósitos.

Bananguin
fonte
Isso é para minha conta no laboratório de informática; Se eu esquecer meu pendrive conectado ao sair, posso deixá-lo em chamas quando voltar para casa. É também por isso que não tenho privilégios de root (e infelizmente pedir algo aos administradores aqui é um processo muito burocrático). O que eu teria que fazer para criar um cliente dbus como você disse? Eu nunca trabalhei com algo assim e não consigo encontrar nenhuma documentação dizendo quais mensagens o gcfs suporta quando a procuro.
Hugomg 28/09/12
0

Finalmente consegui testar o script Python que mencionei como a segunda opção na minha pergunta. Acontece que ele faz trabalho quando pedindo para encerrar bem, não apenas na reinicialização.

hugomg
fonte