如何讓根腳本運行 Pynotify

如何讓根腳本運行 Pynotify

我需要以 root 身分執行一個名為 root.py 的腳本。我需要在腳本中建立通知。我專門為通知製作了一個單獨的腳本,名為notify.py。

這是notify.py:

import pynotify
import sys

def notify(title, message):
    n = pynotify.Notification (title,
        message,
        "notification-message-im")
    n.show()

if __name__ == '__main__':
    notify(sys.argv[1], sys.argv[2])

notify.py 腳本適用於非 root 使用者:

python notify.py Title Message

但我需要在 root.py 中呼叫此腳本,該腳本以 root 身分運行。如果我以 root 身份運行它會失敗。因此,由於缺乏更好的詞語,我嘗試透過以另一個用戶身份啟動 root 來註銷它(我還在下面將 sudo 替換為 gksudo):

xhost local:user
gksudo -u user notify.py Title Message

行不通。

有任何想法嗎?

順便說一句:我在從 root 執行 upstart 腳本執行 gtk 時遇到了類似的問題。此外,當作為其他使用者使用 sudo 時,gvfs 不會以 root 身分更改屬性。

答案1

sux - su 的包裝,它將傳輸您的 X 憑證 http://fgouget.free.fr/sux/

$ sudo apt-get install sux

答案2

直接複製貼上:

如果沒有 root 權限,您將無法在連接埠 80 上開啟伺服器,這是對作業系統層級的限制。因此,唯一的解決方案是在開啟連接埠後放棄 root 權限。

以下是在 Python 中刪除 root 權限的可能解決方案:在 Python 中刪除權限。一般來說,這是一個很好的解決方案,但您還必須添加os.setgroups([])該功能以確保不保留 root 使用者的群組成員資格。

我複製並清理了一些程式碼,並刪除了日誌記錄和異常處理程序,以便您可以OSError正確處理(當不允許進程切換其有效 UID 或 GID 時,它將被拋出):

import os, pwd, grp

def drop_privileges(uid_name='nobody', gid_name='nogroup'):
    if os.getuid() != 0:
        # We're not root so, like, whatever dude
        return

    # Get the uid/gid from the name
    running_uid = pwd.getpwnam(uid_name).pw_uid
    running_gid = grp.getgrnam(gid_name).gr_gid

    # Remove group privileges
    os.setgroups([])

    # Try setting the new uid/gid
    os.setgid(running_gid)
    os.setuid(running_uid)

    # Ensure a very conservative umask
    old_umask = os.umask(077)

這裡

如果您必須重新獲得 root 權限,那麼總是有政策包

答案3

這是一個瘋狂的鏡頭,如果錯誤請否決。如果可能的話,請下次加入相關的錯誤訊息。

也許root用戶只是缺少一個顯示器來進行GUI操作。你有沒有嘗試過:

DISPLAY=:0 python notify.py Title Message

作為根?

答案4

以 root 身分啟動:

匯出“dbus-launch” 

並運行你的通知程序

相關內容