관리자 권한이없는 경우 그놈 로그 아웃 중에 스크립트를 실행하려면 어떻게해야합니까?


18

그놈 세션에서 로그 아웃하기 전에 스크립트를 실행하여 컴퓨터에 연결된 펜 드라이브를 잊어 버렸는지 경고합니다.

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

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

  • 또한 이 게시물 에서 해결 방법을 제안했지만 첫 번째 회신에 따르면 로그 오프하는 대신 컴퓨터를 종료하면 작동하지 않습니다.


답변:


7

Gnome을 사용하면서 아래에서 언급 한 Python 스크립트를 사용하여 아래의 Python 스크립트를 사용할 수 있습니다.

Gnome 로그 아웃 (예 gnome-session-quit:) (또는 gnome shutdown) 이 필요합니다 . GUI에서 로그 아웃을 사용할 때 발생합니다. AFAIK 프로세스가 명령 sudo shutdown -h 0또는으로 종료를 차단할 수 없습니다 sudo poweroff. 실행되면 shutdownSIGTERM이 모든 프로세스에 제공하고 종료 될 때까지 몇 초를 제공합니다 (루트 사용자가 아닌 편집 할 수없는 일부 스크립트를 실행 한 후). 종료하지 않으면 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. OS 로그 아웃 또는 종료 (우분투)
  2. 로그인
  3. AAAAAAAAAAAAAAAAAAAAAAAAAAA데스크탑에 이름이 지정된 파일을 확인하십시오 .

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

파일이 보이면 모든 것이 정상입니다. 이제 shutdown_script.sh필요에 맞게를 편집 할 수 있습니다 . 또한 execute_script_on_shutdown.sh로그인시 실행해야합니다 (또는 시작시 자동 실행 가능하도록 설정).


1

모든 상황에서 세션을 차단하려면 루트 권한이 필요합니다. 그 주위에 방법이 없습니다. 사용자 루트는 항상 kill -9프로세스를 수행 할 수 있습니다 . 셧다운으로 인해 그놈이 "자신이 저장"신호를 보내지 않는 것에 놀랐습니다. 또한 "PostSession"스크립트는 gnome-session이 종료 된 후에 만 ​​실행되며 Xserver가 종료되기 직전에 (믿습니다), 이는 화면에 표시되어야 할 경고를 표시하려는 곳이 아닙니다 ( 맞습니다).

작동하는 것은 a) "자기 저장"그놈 이벤트에 반응하고 b) "자기 안전"에 반응하는 것과 같은 방식으로 SIGTERM에 반응하는 Gnome 응용 프로그램입니다. 그 외에는 특히 루트 권한 없이는 할 수있는 일이 거의 없습니다.

그러나 루트가 아닌 문제를 해결할 수 있습니다. 원하는 권한을 갖고 루트 권한을 가진 사람에게 제안하는 PostSession 스크립트를 작성하여 사용자에게 많은 도움을주는 합리적인 도구이므로 모든 시스템에 배포 할 것을 권장합니다. 일반적으로 루트 권한을 가진 사람은 사용자를 행복하게 / 유지하기 위해 지불됩니다. :-)

해결하려는 문제는 무엇입니까? pendrive가 연결되어 있는데 왜 세션에서 로그 아웃 할 수 없습니까?

"장치를 분리하는 것을 잊지 마십시오!"라는 dbus 클라이언트가있을 수 있습니다. gvfs가 USB 장치에서 파일 시스템 마운트 해제를 알리는 경우 그러나 그것이 그것이 얼마나 잘 작동하는지 또는 심지어 당신의 목적에 도움이되는지 모르겠습니다.


이것은 컴퓨터 실의 내 계정을위한 것입니다. 로그 아웃 할 때 펜 드라이브가 연결되어있는 것을 잊어 버린 경우 집에 갈 때 내버려 둘 수 있습니다. 그렇기 때문에 루트 권한이없는 이유도 있습니다 (불행히도 관리자에게 물어 보는 것은 매우 관료적 인 과정입니다). 당신이 말한 것처럼 dbus 클라이언트를 만들려면 어떻게해야합니까? 나는 이런 식으로 일한 적이 없으며 검색 할 때 gcfs가 지원하는 메시지를 알려주는 문서를 찾을 수 없습니다.
hugomg

0

나는 마침내 내 질문에서 두 번째 옵션으로 언급 한 Python 스크립트를 실제로 테스트 할 수있었습니다. 그것은 밝혀 않습니다 뿐 아니라 다시 부팅 할뿐만 아니라 종료 요청할 때 일을.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.