
root.py라는 루트로 스크립트를 실행해야 합니다. 스크립트 내에서 알림을 생성해야 합니다. 나는 특히 inform.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])
inform.py 스크립트는 루트가 아닌 사용자와 잘 작동합니다.
python notify.py Title Message
하지만 루트로 실행되는 root.py 내에서 이 스크립트를 호출해야 합니다. 루트로 실행하면 실패합니다. 그래서 더 나은 단어가 부족하여 다른 사용자로 시작하여 루트로 로그아웃하려고 했습니다(다음에서는 sudo를 gksudo로 대체했습니다).
xhost local:user
gksudo -u user notify.py Title Message
작동하지 않습니다.
어떤 아이디어가 있나요?
btw: 루트 실행 upstart 스크립트에서 gtk를 실행하는 것과 비슷한 문제가 있었습니다. 또한 gvfs는 다른 사용자가 sudo인 경우 루트로 속성을 변경하지 않습니다.
답변1
sux - X 자격 증명을 전송하는 su 주위의 래퍼 http://fgouget.free.fr/sux/
$ sudo apt-get install sux
답변2
직접 복사하여 붙여넣기:
루트 권한 없이는 포트 80에서 서버를 열 수 없습니다. 이는 OS 수준의 제한 사항입니다. 따라서 유일한 해결책은 포트를 연 후 루트 권한을 삭제하는 것입니다.
Python에서 루트 권한을 삭제하는 가능한 솔루션은 다음과 같습니다.Python에서 권한 삭제. 이는 일반적으로 좋은 해결 방법이지만 os.setgroups([])
루트 사용자의 그룹 멤버십이 유지되지 않도록 하려면 함수에 추가해야 합니다 .
코드를 약간 복사하여 정리하고 로깅 및 예외 처리기를 제거하여 적절 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)
~에서여기.
루트 권한을 다시 얻어야 한다면 항상정책 키트.
답변3
이것은 거친 샷입니다. 잘못된 경우 반대표를 보내주십시오. 다음에는 가능하다면 관련 오류 메시지를 추가해 주세요.
아마도 루트 사용자에게는 GUI 작업을 수행할 디스플레이가 없을 수도 있습니다. 시도해 보셨나요:
DISPLAY=:0 python notify.py Title Message
루트로?.
답변4
루트로 다음을 실행합니다.
'dbus-launch' 내보내기
그리고 알림 프로그램을 실행하세요