Executando o script Python via cron com sudo?

0

Estou usando o Linux Mint.

Eu escrevi um script python que é projetado para não ser acessível para o usuário padrão logado, mas ainda é executado enquanto eles estiverem conectados. É para executá-los e desconectá-los se um determinado campo estiver configurado em um mysql. banco de dados e mostrar uma caixa de diálogo dizendo "você está sendo desconectado blah".

Se eu executar o script python como o usuário padrão, tudo estará bem e eles serão desconectados.

Se eu executar o script python como o usuário administrador, obtenho:

glib.GError: Unable to connect to server

quando ele tenta mostrar a caixa de diálogo

Se eu executar novamente o script com o usuário admin e sudo , isso funcionará.

A idéia é que isso seja executado a partir do cron e, a menos que eu possa fazer com que o cron execute o script, o usuário admin com sudo não funcionará.

Alguma ajuda?

EDITAR

estas são as duas partes do script

essa parte é chamada toda vez que o script é executado e mostrará uma notificação com o tempo que o usuário deixou

    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()

Esta parte só é executada se determinadas condições forem cumpridas, ou seja, o tempo que elas restam é inferior a 5 minutos.

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
    
por 0x7c0 15.11.2011 / 16:21

2 respostas

2

Por que você não adiciona o cronjob ao crontab do usuário padrão?

...

Se tiver que ir no crontab do usuário administrador e você precisar executá-lo com o sudo para que ele seja executado corretamente, então uma solução pode ser modificar o arquivo sudoers para permitir que o usuário administrador execute o script python sem uma senha.

admin hostname = NOPASSWD: /path/to/python/script.py

Em seguida, no arquivo crontab do usuário admin :

0 0 * * * sudo /path/to/python/script.py > /tmp/script.py.log 2>&1

Para executar o script à meia-noite e registrar a saída em /tmp/script.py.log (para que você possa ver onde / se ocorrem erros).

Isso pressupõe que o uso de admin user indica que você tem um usuário não raiz com o nome de usuário admin . Caso contrário, por padrão, o usuário root tem permissão para executar comandos sudo sem autenticação.

    
por 15.11.2011 / 17:15
1

Você pode simplesmente adicioná-lo ao crontab do root: sudo crontab -e

Ele será executado como root no agendamento especificado. Veja man 5 crontab para o formato de arquivo crontab.

EDITAR

DISPLAY=:0
*/5 * * * * /path/to/your/script
    
por 15.11.2011 / 16:55

Tags