我正在使用 Linux Mint。
我编写了一个python脚本,该脚本设计为登录的标准用户无法访问,但在登录时仍然执行。如果在mysql数据库中设置了某个字段并显示,则运行并注销它们一个对话框说“你正在注销等等”。
如果我以标准用户身份运行 python 脚本,一切都会很好,并且他们会被注销。
如果我以管理员用户身份运行 python 脚本,我会得到:
glib.GError: Unable to connect to server
当它尝试显示对话框时
如果我使用管理员用户重新运行该脚本sudo
,它就会起作用。
这个想法是从 cron 运行,除非我能让 cron 以管理员用户身份运行脚本,否则sudo
它不会工作。
有什么帮助吗?
编辑
这是脚本的两个 GUI 部分
每次脚本运行时都会调用此部分,并将显示一条通知,其中包含用户剩余的时间
u.get_time_left()
n = pynotify.Notification("Time Left", str(u.timeLeft / 60)+" Minutes remaining")
n.set_urgency(pynotify.URGENCY_CRITICAL)
n.set_timeout(10000) # 10 seconds
n.set_category("device")
helper = gtk.Button()
icon = helper.render_icon(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG)
#n.set_icon_from_pixbuf(icon)
try :
n.show()
该部分仅在满足某些条件时运行,即剩余时间少于 5 分钟。
def getText():
#base this on a message dialog
dialog = gtk.MessageDialog(
None,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
gtk.MESSAGE_QUESTION,
gtk.BUTTONS_OK,
None)
dialog.set_markup('Your time limit is nearing the <b>end</b>')
entryUser = gtk.Entry()
entryPass =gtk.Entry()
entryUser.connect("activate", responseToDialog, dialog, gtk.RESPONSE_OK)
hbox = gtk.HBox()
hbox.pack_start(gtk.Label("Username:"), False, 5, 5)
hbox.pack_start(entryUser)
hbox.pack_start(gtk.Label("Password:"), False, 5, 5)
hbox.pack_start(entryPass)
dialog.format_secondary_markup("Please enter a new voucher <i>Username</i> and <i>password</i> to carry on your current session")
dialog.vbox.pack_end(hbox, True, True, 0)
dialog.show_all()
dialog.run()
username = entryUser.get_text()
password = entryPass.get_text()
dialog.destroy()
voucher = {'username':username,'password':password}
return voucher
答案1
为什么不将 cronjob 添加到标准用户的 crontab 中?
...
如果它必须进入管理员用户的 crontab,并且您必须使用 sudo 运行它才能正常运行,那么您的一种解决方案可能是修改 sudoers 文件以允许管理员用户无需密码即可运行 python 脚本。
admin hostname = NOPASSWD: /path/to/python/script.py
然后在admin
用户的 crontab 文件中:
0 0 * * * sudo /path/to/python/script.py > /tmp/script.py.log 2>&1
在午夜运行脚本并将输出记录到/tmp/script.py.log
(以便您可以查看错误发生的位置/是否发生)。
这假设您对admin
user 的使用表明您有一个名为 username 的非 root 用户admin
。否则,默认情况下,root
允许用户无需身份验证即可运行 sudo 命令。
答案2
你可以将它添加到 root 的 crontab 中:sudo crontab -e
它将按照指定的时间表以 root 身份运行。请参阅man 5 crontab
参考资料 中的 crontab 文件格式。
编辑
DISPLAY=:0
*/5 * * * * /path/to/your/script