我需要以 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`
并运行你的通知程序