Làm cách nào tôi có thể chạy tập lệnh trong quá trình đăng xuất Gnome nếu tôi không có quyền quản trị viên?


18

Tôi muốn chạy một kịch bản trước khi tôi đăng xuất khỏi phiên Gnome của mình, để cảnh báo bản thân nếu tôi quên một ổ đĩa được cắm vào máy.

Tuy nhiên, tất cả các giải pháp tôi tìm thấy vẫn chưa đủ với tôi:

  • Câu hỏi tương tự này gợi ý chỉnh sửa /etc/gdm/PostSession/Defaulttệp, nhưng tôi không có quyền để làm điều đó. (Và tệp hiện đang trống trên máy của tôi, vì vậy không có móc nối nào để tận dụng)

  • Tôi cũng tìm thấy bài đăng này đề xuất một cách giải quyết, nhưng theo phản hồi đầu tiên, nó không hoạt động nếu tôi tắt máy tính thay vì chỉ đăng xuất.


Câu trả lời:


7

Khi bạn đang sử dụng Gnome, bạn có thể sử dụng tập lệnh Python bên dưới, được điều chỉnh từ tập lệnh bạn đã đề cập.

Nó cần đăng xuất Gnome (tức là gnome-session-quit) (hoặc tắt gnome), điều này xảy ra khi chúng ta sử dụng đăng xuất trong GUI. AFAIK không có quá trình nào có thể chặn tắt máy bằng lệnh sudo shutdown -h 0hoặc bằng sudo poweroff. Khi shutdownđược thực thi, nó cung cấp SIGTERM cho tất cả quá trình và cho chúng một vài giây để thoát ra (Sau khi thực thi một số tập lệnh không thể được chỉnh sửa bởi người dùng không phải root). Nếu không thoát khỏi các quy trình sẽ bị SIGKILL giết chết.

Đây là từng bước thủ tục của gnome_save_yourselfphương pháp. Hãy làm một bài kiểm tra.

  1. Lưu mã sau dưới dạng ~/Desktop/execute_script_on_shutdown.sh (Từ 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. Làm cho nó thực thi:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Lưu lại như sau ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Thực thi kịch bản chính

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Bây giờ bạn cảm thấy kịch bản chờ đợi một cái gì đó

  1. Đăng xuất hoặc tắt hệ điều hành của bạn (Ubuntu)
  2. Đăng nhập
  3. Kiểm tra một tập tin có tên AAAAAAAAAAAAAAAAAAAAAAAAAAAtrên máy tính để bàn của bạn.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Nếu bạn thấy tập tin mọi thứ đều ổn. Bây giờ bạn có thể chỉnh sửa shutdown_script.shcho phù hợp với nhu cầu của bạn. Cũng nhớ thực hiện execute_script_on_shutdown.shđăng nhập khi bật (hoặc làm cho nó tự động thực thi khi khởi động).


1

Nếu bạn muốn phiên của bạn bị chặn trong mọi trường hợp, bạn cần quyền root. Không có cách nào khác. Người dùng root luôn có thể kill -9các quy trình của bạn. Tôi ngạc nhiên rằng việc tắt máy không khiến gnome phát ra tín hiệu "tự cứu mình". Ngoài ra, tôi tin rằng các tập lệnh "PostSession" chỉ được chạy sau khi phiên gnome kết thúc và (tôi tin) ngay trước khi Xserver chấm dứt, có nghĩa đó không phải là nơi bạn muốn đưa ra cảnh báo được cho là hiển thị trên màn hình (nếu Tôi đúng).

Những gì có thể hoạt động là một ứng dụng Gnome mà a) phản ứng với sự kiện gnome "tự cứu mình" VÀ b) phản ứng với SIGTERM giống như cách nó phản ứng với "an toàn cho chính mình". Ngoài ra, bạn có thể làm rất ít, đặc biệt là không có quyền root.

Tuy nhiên, bạn có thể giải quyết vấn đề không phải root: Viết tập lệnh PostSession thực hiện những gì bạn muốn và đề xuất với ai đó có quyền root để triển khai nó trên tất cả các máy vì đây là một công cụ hợp lý giúp người dùng rất nhiều. Thông thường những kẻ có quyền root được trả tiền để làm / giữ cho người dùng hài lòng. :-)

Vấn đề bạn đang cố gắng giải quyết là gì? Tại sao bạn không thể đăng xuất phiên của mình khi một ổ cắm được cắm vào?

Bạn có thể có một máy khách dbus hiển thị "Đừng quên rút phích cắm thiết bị!" khi gvfs thông báo ngắt kết nối Hệ thống tập tin trên thiết bị USB. Nhưng tôi không biết nó hoạt động tốt như thế nào hoặc thậm chí phục vụ mục đích của bạn.


Đây là tài khoản của tôi tại phòng thí nghiệm máy tính; Nếu tôi quên con lắc của mình cắm vào khi tôi đăng xuất, tôi có thể để nó ở lại khi tôi về nhà. Đây cũng là lý do tại sao tôi không có quyền riêng tư gốc (và thật không may yêu cầu bất cứ điều gì cho các quản trị viên ở đây là một quá trình rất đơn giản). Tôi sẽ phải làm gì để tạo ra một máy khách dbus như bạn nói? Tôi chưa bao giờ làm việc với một cái gì đó như thế này và tôi không thể tìm thấy bất kỳ tài liệu nào nói về những thông điệp mà gcfs hỗ trợ khi tôi tìm kiếm nó.
hugomg

0

Cuối cùng tôi đã quản lý để thực sự kiểm tra tập lệnh Python mà tôi đã đề cập như là tùy chọn thứ hai trong câu hỏi của mình. Nó chỉ ra rằng nó cũng hoạt động khi yêu cầu tắt, không chỉ khi khởi động lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.