如何让 Root 脚本运行 Pynotify

如何让 Root 脚本运行 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 脚本时遇到了类似的问题。此外,当以 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

以 root 身份?

答案4

以 root 身份启动:

导出`dbus-launch` 

并运行你的通知程序

相关内容