Как я могу запустить скрипт во время выхода из GNOME, если у меня нет прав администратора?

18

Я хочу запустить скрипт перед выходом из сеанса GNOME, чтобы предупредить себя, если я забыл, что к машине подключен Pendrive.

Тем не менее, все решения, которые я нашел, мне не хватило:

  • Этот похожий вопрос предполагает редактирование /etc/gdm/PostSession/Defaultфайла, но у меня нет прав для этого. (И файл в настоящее время пуст на моей машине, поэтому нет никаких существующих хуков, чтобы воспользоваться)

  • Я также обнаружил, что этот пост предлагает обходной путь, но, согласно первому ответу, он не работает, если я выключаю компьютер вместо того, чтобы выходить из системы.

hugomg
источник

Ответы:

7

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

Требуется выход из Gnome (т. Е. gnome-session-quit) (Или выключение Gnome), который происходит, когда мы используем выход из GUI. AFAIK ни один процесс не может заблокировать отключение по команде sudo shutdown -h 0или по sudo poweroff. Когда shutdownвыполняется, это дает SIGTERM всем процессам и дает им несколько секунд для выхода (после выполнения некоторых сценариев, которые не могут редактировать пользователи без прав root). Если процесс не завершен, SIGKILL принудительно уничтожает его.

Это пошаговая процедура gnome_save_yourselfметода. Давайте сделаем тест.

  1. Сохранить следующий код как ~/Desktop/execute_script_on_shutdown.shhttp://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-session и (я полагаю) непосредственно перед завершением Xserver, то есть это не то место, где вы бы хотели разместить предупреждение, которое должно отображаться на экране (если Я прав).

То, что может работать, - это приложение Gnome, которое а) реагирует на событие гнома «спаси себя» И б) реагирует на SIGTERM таким же образом, как оно реагирует на «безопасность себя». Помимо этого, вы мало что можете сделать, особенно без привилегий root.

Однако вы можете решить проблему без полномочий root: напишите скрипт PostSession, который делает то, что вы хотите, и предложите кому-нибудь с привилегиями root развернуть его на всех машинах, поскольку это разумный инструмент, который очень помогает пользователям. Обычно парням с привилегиями root платят, чтобы сделать пользователей счастливыми. :-)

Какую проблему вы пытаетесь решить? Почему вы не можете выйти из сеанса, когда Pendrive подключен?

У вас может быть клиент dbus с надписью «Не забудьте отключить устройство!» когда gvfs объявляет о размонтировании файловой системы на USB-устройстве. Но я не знаю, насколько хорошо это работает или даже служит вашим целям.

Bananguin
источник
Это для моей учетной записи в компьютерной лаборатории; Если я забуду, что мой Pendrive подключен, когда я выхожу из системы, я могу оставить его включенным, когда я иду домой. По этой же причине у меня нет привилегий суперпользователя (и, к сожалению, просить что-либо для администраторов здесь - очень бурный процесс). Что мне нужно сделать, чтобы сделать клиент dbus, как ты сказал? Я никогда не работал с чем-то вроде этого, и я не могу найти документацию, рассказывающую, какие сообщения поддерживает gcfs при поиске.
hugomg
0

Мне наконец-то удалось протестировать скрипт Python, который я упомянул в качестве второго варианта в моем вопросе. Оказывается , что он делает работу , когда просят , чтобы закрыть, а не только при перезагрузке.

hugomg
источник