使用 sudo 通过 cron 运行 Python 脚本?

使用 sudo 通过 cron 运行 Python 脚本?

我正在使用 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(以便您可以查看错误发生的位置/是否发生)。

这假设您对adminuser 的使用表明您有一个名为 username 的非 root 用户admin。否则,默认情况下,root允许用户无需身份验证即可运行 sudo 命令。

答案2

你可以将它添加到 root 的 crontab 中:sudo crontab -e

它将按照指定的时间表以 root 身份运行。请参阅man 5 crontab参考资料 中的 crontab 文件格式。

编辑

DISPLAY=:0
*/5 * * * * /path/to/your/script

相关内容