
Мне нужно запустить скрипт от имени пользователя 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
Не получится.
Есть идеи?
btw: У меня была похожая проблема с запуском gtk от root, запускал скрипты upstart. Также gvfs не меняет атрибуты как root, когда другой пользователь как sudo.
решение1
sux - оболочка вокруг su, которая перенесет ваши учетные данные X http://fgouget.free.fr/sux/
$ sudo apt-get install sux
решение2
Прямое копирование и вставка:
Вы не сможете открыть сервер на порту 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)
отздесь.
Если вам НЕОБХОДИМО восстановить привилегии root, всегда естьнабор политик.
решение3
Это дикий выстрел, пожалуйста, поставьте минус, если это неправильно. Пожалуйста, в следующий раз, если возможно, добавьте соответствующие сообщения об ошибках.
Возможно, у пользователя root просто нет дисплея для выполнения операций GUI. Вы пробовали:
DISPLAY=:0 python notify.py Title Message
как root?
решение4
как root, запустите:
экспорт `dbus-launch`
и запустите свою программу уведомлений