
root.py というスクリプトを root として実行する必要があります。スクリプト内で通知を作成する必要があります。通知専用の、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])
notification.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 から gtk を実行して upstart スクリプトを実行したときにも同様の問題が発生しました。また、gvfs は sudo などの他のユーザーとして実行した場合、root として属性を変更しません。
答え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` をエクスポートする
通知プログラムを実行する