Gnome

如果我沒有管理員權限,如何在 GNOME 註銷期間執行腳本?

  • December 13, 2019

我想在退出 GNOME 會話之前執行一個腳本,以在我忘記插入機器的 pendrive 時警告自己。

但是,我發現的所有解決方案對我來說都不夠:

  • 這個類似的問題建議編輯/etc/gdm/PostSession/Default文件,但我沒有這樣做的權限。(而且我的機器上的文件目前是空的,所以沒有現有的鉤子可以利用)
  • 我還發現這篇文章提出了一種解決方法,但是根據第一個回复,如果我關閉電腦而不是僅註銷,它就不起作用。

當您使用 Gnome 時,您可以使用下面的 Python 腳本,改編自您提到的腳本。

它需要 Gnome 註銷(即gnome-session-quit)(或 gnome 關閉),當我們在 GUI 中使用註銷時會發生這種情況。AFAIK 沒有程序可以通過命令sudo shutdown -h 0sudo poweroff. 執行時shutdown,它會向所有程序提供 SIGTERM 並讓它們退出幾秒鐘(在執行一些非 root 使用者無法編輯的腳本之後)。如果未退出的程序被 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() 
  1. 使其可執行:
chmod +x ~/Desktop/execute_script_on_shutdown.sh
  1. 將以下內容另存為~/Desktop/shutdown_script.sh
#!/usr/bin/bash
touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
  1. 執行主腳本
bash ~/Desktop/execute_script_on_shutdown.sh

現在你覺得腳本在等待什麼

  1. 註銷或關閉您的作業系統 (Ubuntu)
  2. 登錄
  3. 檢查AAAAAAAAAAAAAAAAAAAAAAAAAAA桌面上命名的文件。
ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA

如果你看到文件一切正常。現在您可以shutdown_script.sh根據需要進行編輯。還記得execute_script_on_shutdown.sh在登錄時執行(或使其在啟動時自動執行)。

如果您希望您的會話在所有情況下都被阻止,您需要 root 權限。沒有辦法解決這個問題。使用者 root 始終kill -9可以處理您的程序。我很驚訝關機不會讓 gnome 發出“保存自己”的信號。此外,我相信“PostSession”腳本僅在 gnome-session 終止後和(我相信)在 Xserver 終止之前執行,這意味著這不是您想要在螢幕上顯示警告的地方(如果我是對的)。

可能有用的是一個 Gnome 應用程序,它 a) 對“save-yourself” gnome 事件做出反應,並且 b) 對 SIGTERM 做出反應,就像它對“safe-yourself”做出反應一樣。除此之外,您幾乎無能為力,尤其是在沒有 root 權限的情況下。

但是,您可以解決非 root 問題:編寫一個 PostSession 腳本來執行您想要的操作,並建議具有 root 權限的人將其部署到所有機器上,因為它是一個可以幫助使用者很多的明智工具。通常,擁有 root 權限的人會得到報酬以使/讓使用者滿意。:-)

您要解決的問題是什麼?為什麼插入 pendrive 時不能退出會話?

您可以擁有一個顯示“不要忘記拔掉設備!”的 dbus 客戶端。當 gvfs 宣佈在 USB 設備上解除安裝文件系統時。但我不知道它的效果如何,甚至不符合您的目的。

引用自:https://unix.stackexchange.com/questions/49333