Как сделать корневой сценарий выполненным Pynotify

Я должен запустить скрипт как корень, названный 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.

1
задан 18 March 2012 в 00:03

4 ответа

Это дикий выстрел, пожалуйста, понизьте его, если он не прав. Пожалуйста, в следующий раз, если возможно, добавьте соответствующие сообщения об ошибках.

Может быть, пользователю root просто не хватает дисплея для выполнения операций с графическим интерфейсом. Вы пробовали:

DISPLAY=:0 python notify.py Title Message

как root?.

0
ответ дан 18 March 2012 в 00:03

sux - оболочка вокруг su, которая будет передавать ваши учетные данные X http://fgouget.free.fr/sux/

$ sudo apt-get install sux
0
ответ дан 18 March 2012 в 00:03

от имени пользователя root запустите:

export `dbus-launch` 

и запустите программу уведомлений

0
ответ дан 18 March 2012 в 00:03

Прямое копирование и вставка:

Вы не сможете открыть сервер на порту 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 .

0
ответ дан 18 March 2012 в 00:03

Другие вопросы по тегам:

Похожие вопросы: