
我需要以 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”
並運行你的通知程序