관리자 권한이 없으면 그놈 로그아웃 중에 스크립트를 어떻게 실행합니까?

관리자 권한이 없으면 그놈 로그아웃 중에 스크립트를 어떻게 실행합니까?

그놈 세션을 종료하기 전에 펜 드라이브를 컴퓨터에 삽입하는 것을 잊었을 경우 스스로에게 경고하는 스크립트를 실행하고 싶습니다.

그러나 내가 찾은 모든 솔루션으로는 충분하지 않았습니다.

  • 이 비슷한 질문파일 을 편집하라는 제안이 있었지만 /etc/gdm/PostSession/Default그렇게 할 수 있는 권한이 없습니다. (그리고 파일은 현재 내 컴퓨터에 비어 있으므로 악용할 기존 후크가 없습니다.)

  • 나도 찾았어이 게시물해결 방법을 제안해 보세요. 첫 번째 답변에 따르면 로그아웃하지 않고 컴퓨터를 종료하면 작동하지 않습니다.

답변1

Gnome을 사용할 때 언급한 스크립트를 수정한 다음 Python 스크립트를 사용할 수 있습니다.

gnome-session-quitGUI에서 로그아웃을 사용할 때 발생하는 Gnome 로그아웃(예: )(또는 gnome 종료)이 필요합니다 . AFAIK는 명령 sudo shutdown -h 0이나 종료를 통해 프로세스를 차단할 수 없습니다 sudo poweroff. 실행되면 shutdown모든 프로세스에 SIGTERM 신호를 보내고 종료할 때까지 몇 초의 시간을 줍니다(루트가 아닌 사용자가 편집할 수 없는 일부 스크립트를 실행한 후). 종료되지 않으면 SIGKILL에 의해 프로세스가 강제 종료됩니다.

다음은 방법의 단계별 프로세스입니다 gnome_save_yourself. 테스트를 해보자.

  1. 다음 코드를 다음과 같이 저장합니다 ~/Desktop/execute_script_on_shutdown.sh (fromhttp://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(또는 시작 시 자동 실행되도록 설정).

답변2

어떤 상황에서도 세션을 차단하려면 루트 권한이 필요합니다. 이 문제를 해결할 수 있는 방법이 없습니다. 사용자 루트는 항상 kill -9프로세스에 액세스할 수 있습니다. 놀랍게도 닫아도 gnome은 "자신을 구하세요"라는 신호를 보내지 않습니다. 또한 "PostSession" 스크립트는 gnome-session이 종료된 후 그리고 Xserver가 종료되기 전에만 실행된다고 생각합니다. 이는 화면에 경고를 표시하려는 위치가 아니라는 것을 의미합니다(제가 옳다면).

작동할 수 있는 것은 a) "save-yourself" gnome 이벤트에 반응하고 b) "safe-yourself"에 반응하는 것과 동일한 방식으로 SIGTERM에 반응하는 Gnome 애플리케이션입니다. 그 외에도 특히 루트 액세스 없이는 할 수 있는 일이 거의 없습니다.

그러나 루트가 아닌 문제를 해결할 수 있습니다. PostSession 스크립트를 작성하여 원하는 작업을 수행하고 루트 액세스 권한이 있는 사람들이 이를 모든 컴퓨터에 배포하도록 권장합니다. 이는 사용자에게 많은 도움을 줄 수 있는 스마트 도구이기 때문입니다. 루트 액세스 권한이 있는 사람들은 사용자를 만족시키기 위해 돈을 받는 경우가 많습니다. :-)

해결하고 싶은 문제는 무엇입니까? USB 플래시 드라이브를 삽입한 후 세션에서 로그아웃할 수 없는 이유는 무엇입니까?

"장치를 분리하는 것을 잊지 마세요!"라고 말하는 dbus 클라이언트를 가질 수 있습니다. gvfs가 USB 장치에서 파일 시스템 마운트 해제를 알릴 때. 그러나 그것이 얼마나 효과적인지, 심지어 그것이 당신의 목적에 도움이 될지는 모르겠습니다.

답변3

마침내 질문의 두 번째 옵션으로 언급한 Python 스크립트를 실제로 테스트할 수 있었습니다. 그것은 밝혀졌다하다다시 시작할 때뿐만 아니라 종료하라는 메시지가 표시될 때도 작동합니다.

관련 정보