Як я можу запустити сценарій під час виходу з GNOME, якщо у мене немає прав адміністратора?


18

Я хочу запустити сценарій, перш ніж вийти зі свого сеансу GNOME, щоб попередити себе, якщо я забув маятник, підключений до машини.

Однак усіх знайдених мною рішень було недостатньо для мене:

  • Це подібне питання пропонує редагувати /etc/gdm/PostSession/Defaultфайл, але я не маю дозволів на це. (І файл наразі порожній на моїй машині, тому немає жодних гачків, якими можна скористатися)

  • Я також знайшов цю публікацію, яка пропонує вирішення проблеми, але, згідно з першою відповіддю, вона не працює, якщо вимкнути комп'ютер, а не лише вийти з системи.


Відповіді:


7

Під час використання Gnome ви можете використовувати нижчезазначений сценарій Python, адаптований до того, який ви згадали.

Він потребує виходу Gnome (тобто gnome-session-quit) (або відключення gnome), це відбувається, коли ми використовуємо вихід у GUI. AFAIK жоден процес не може заблокувати відключення командою sudo shutdown -h 0або sudo poweroff. Коли shutdownвін виконується, він дає SIGTERM всім процесам і дає їм кілька секунд для виходу (Після виконання деяких сценаріїв, які не можуть бути відредаговані користувачами, які не користуються коренем). Якщо не вийшли з процесу, то SIGKILL насильно вбивається.

Це покрокова процедура gnome_save_yourselfметоду. Давайте зробимо тест.

  1. Збережіть наступний код як ~/Desktop/execute_script_on_shutdown.sh (Від 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. Зробіть його виконуваним:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Збережіть наступне як ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Виконати основний сценарій

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Тепер ви відчуваєте, що сценарій чогось чекає

  1. Вихід або вимкнення ОС (Ubuntu)
  2. Увійти
  3. Перевірте файл, названий AAAAAAAAAAAAAAAAAAAAAAAAAAAна вашому робочому столі.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Якщо ви бачите файл, все гаразд. Тепер ви можете відредагувати відповідно shutdown_script.shдо ваших потреб. Також не забудьте виконати при execute_script_on_shutdown.shвході (або зробити його автоматично виконуваним при запуску).


1

Якщо ви хочете, щоб ваш сеанс блокувався за будь-яких обставин, вам потрібні root-права. Не обійтись. Користувач root завжди може здійснювати kill -9ваші процеси. Я здивований, що відключення не змушує гнома випромінювати сигнал "врятувати себе". Також я вважаю, що сценарії "PostSession" запускаються лише після припинення сеансу gnome і (я вважаю) безпосередньо до закінчення Xserver, тобто це не місце, де ви хочете поставити попередження, яке повинно з'являтися на екрані (якщо Я маю рацію).

Що може працювати - це програма Gnome, яка a) реагує на подію gnome "збереження себе" І b) реагує на SIGTERM так само, як реагує на "безпеку". Крім того, ви мало чого зможете зробити, особливо без привілеїв root.

Однак ви можете вирішити некореневу проблему: Напишіть сценарій PostSession, який виконує те, що ви хочете, і запропонуйте комусь із root-привілеями розгорнути його на всіх машинах, оскільки це розумний інструмент, який багато допомагає користувачам. Зазвичай хлопці з root-привілеями платять, щоб зробити / зберегти користувачів щасливими. :-)

Яку проблему ви намагаєтеся вирішити? Чому ви не можете вийти з сеансу, коли підключений мандат?

Ви можете мати клієнт dbus, який відображає "Не забудьте відключити пристрій від мережі!" коли gvfs оголошує про відключення файлової системи на USB-пристрої. Але я не знаю, наскільки добре це працює або навіть служить вашим цілям.


Це для мого рахунку в комп'ютерній лабораторії; Якщо я забуду, що підключений маятник під час виходу, я можу залишити його, коли я йду додому. Ось чому я не маю корінних привілеїв (і, на жаль, просити що-небудь про адміністраторів, це дуже бюрократичний процес). Що я повинен зробити, щоб зробити клієнт dbus таким, як ви сказали? Я ніколи не працював з чимось подібним, і не можу знайти жодної документації, яка б розповідала, які повідомлення підтримує gcfs, коли я шукаю його.
hugomg

0

Нарешті мені вдалося фактично протестувати сценарій Python, який я згадував як другий варіант у своєму запитанні. Виявляється , що він робить роботу , коли просять , щоб закрити, а не тільки при перезавантаженні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.