管理者権限がない場合、GNOMEログアウト中にスクリプトを実行するにはどうすればよいですか?


18

GNOMEセッションからログアウトする前にスクリプトを実行して、マシンに接続されたペンドライブを忘れた場合に自分自身に警告したい。

しかし、私が見つけたすべての解決策は私にとって十分ではありませんでした:

  • この同様の質問は、/etc/gdm/PostSession/Defaultファイルの編集を示唆していますが、それを行う権限がありません。(そして、私のマシンでは現在ファイルが空なので、利用する既存のフックはありません)

  • 私も見つけ、このポストは回避策を示唆したが、最初の回答によると、それは動作しません私のシャットダウン場合、コンピュータだけではなく、ログオフの。


回答:


7

Gnomeを使用しているので、あなたが言及したものから適応した以下のPythonスクリプトを使用できます。

Gnomeのログアウト(つまりgnome-session-quit)(またはgnomeのシャットダウン)が必要です。これは、GUIでログアウトを使用するときに発生します。私の知る限り、コマンドsudo shutdown -h 0またはによってシャットダウンをブロックできるプロセスはありませんsudo poweroff。ときshutdownexecuedされ、それは、すべてのプロセスに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. OSをログアウトまたはシャットダウンします(Ubuntu)
  2. ログインする
  3. AAAAAAAAAAAAAAAAAAAAAAAAAAAデスクトップ上の名前のファイルを確認します。

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

ファイルがすべて表示されたらOKです。これでshutdown_script.sh、必要に応じてを編集できます。またexecute_script_on_shutdown.sh、ログイン時に実行する(または起動時に自動実行可能にする)ことを忘れないでください。


1

すべての状況下でセッションをブロックする場合は、root特権が必要です。それを回避する方法はありません。ユーザーrootは常にkill -9プロセスを実行できます。シャットダウンしてもgnomeが「save-yourself」信号を発しないことに驚いています。また、「PostSession」スクリプトは、gnome-sessionが終了した後、Xserverが終了する直前にのみ実行されると考えています。私は正しいです)。

動作するのは、a)「自分自身を保存」gnomeイベントに反応し、b)「自分自身に安全」に反応するのと同じ方法でSIGTERMに反応するGnomeアプリケーションです。特にルート権限がなければ、できることはほとんどありません。

ただし、ルート以外の問題は解決できます。ユーザーが大いに役立つ賢明なツールであるため、必要なことを実行するPostSessionスクリプトを作成し、ルート特権を持つユーザーに提案してすべてのマシンに展開します。通常、ルート特権を持つ人は、ユーザーを幸せにするために支払われます。:-)

解決しようとしている問題は何ですか?ペンドライブが接続されているときにセッションからログアウトできないのはなぜですか?

「デバイスのプラグを抜くのを忘れないでください!」と表示されるdbusクライアントを使用できます。gvfsがUSBデバイス上のファイルシステムのアンマウントをアナウンスするとき。しかし、それがどれほどうまく機能するのか、あなたの目的に役立つのかさえわかりません。


これは、コンピューターラボのアカウント用です。ログアウト時にペンドライブが差し込まれているのを忘れた場合は、家に帰ったときにそのままにしておくことができます。これが、私がルート権限を持っていない理由でもあります(残念ながら、ここの管理者に何かを尋ねるのは非常に官僚的なプロセスです)。あなたが言ったようにdbusクライアントを作成するにはどうすればよいですか?私はこのようなものを扱ったことはなく、検索時にgcfsがサポートするメッセージを説明するドキュメントを見つけることができません。
hugomg

0

ついに質問の2番目のオプションとして言及したPythonスクリプトを実際にテストすることができました。リブート時だけでなく、シャットダウンするように要求しても機能することわかりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.