Я должен запустить скрипт как корень, названный 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 работает хорошо с пользователем не как корень:
python notify.py Title Message
Но я должен назвать этот сценарий внутри root.py, который является, работал как корень. Это перестало работать, если я выполняю его как корень. Так, я пытался из-за отсутствия лучших слов, выписаться как корень путем запуска его как другой пользователь (я также заменил sudo gksudo в следующем):
xhost local:user
gksudo -u user notify.py Title Message
Не будет работать.
Какие-либо идеи?
btw: у Меня была подобная проблема с выполнением gtk от корня, запустил новомодные скрипты. Кроме того, gvfs не изменит атрибуты как корень когда как другой пользователь как sudo.
Это дикий выстрел, пожалуйста, понизьте его, если он не прав. Пожалуйста, в следующий раз, если возможно, добавьте соответствующие сообщения об ошибках.
Может быть, пользователю root просто не хватает дисплея для выполнения операций с графическим интерфейсом. Вы пробовали:
DISPLAY=:0 python notify.py Title Message
как root?.
sux - оболочка вокруг su, которая будет передавать ваши учетные данные X http://fgouget.free.fr/sux/
$ sudo apt-get install sux
от имени пользователя root запустите:
export `dbus-launch`
и запустите программу уведомлений
Прямое копирование и вставка:
Вы не сможете открыть сервер на порту 80 без привилегий root, это ограничение на уровне ОС. Таким образом, единственное решение - удалить привилегии root после того, как вы открыли порт.
Вот возможное решение для удаления привилегий root в Python: Удаление привилегий в 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)
из здесь .
Если вы ДОЛЖНЫ вернуть корневые привилегии, всегда есть policykit .