Por que o script de trabalho cron do root precisa de 'sudo' para ser executado corretamente?

6

Estou executando este script simples no meu Raspberry Pi para atualização automática para que eu possa esquecê-lo. Também mantém um log que informa se a atualização foi bem-sucedida. O script é update.sh:

#!/bin/bash
echo "Update starts on: $(date)" >> /home/pi/update.log
 if apt-get update && apt-get upgrade -y; then
    echo "update successful $(date)"  >> /home/pi/update.log
 else
    echo "Couldn't update $(date)" >> /home/pi/update.log
 fi

Eu adicionei esse script ao crontab raiz usando sudo crontab -e e o cronjob está definido para ser executado todos os dias às 6h

0 6 * * * /home/pi/update.sh

Eu sei que funciona até certo ponto porque executar sudo ./update.sh no shell executa manualmente os comandos e deixa uma entrada "bem-sucedida" no log. Por outro lado, quando executado a partir do crontab, sempre recebo a entrada "não foi possível atualizar". Caso seja importante, o script "update.sh" foi criado pelo usuário "pi" e nunca alterei as permissões, exceto dar permissões de execução.

Eu li outra pergunta sobre o mesmo problema e o cara resolveu colocando um sudo na frente do comando. Ele admite que é estranho porque já está sendo executado pelo root, mas diz que funciona. Eu tentei adicionar o sudo e verifiquei que ele realmente funciona agora.

Alguém sabe por que isso acontece? Por que precisa do sudo se já é root?

    
por freejuices 30.01.2015 / 19:06

2 respostas

7

O Cron executa comandos de um shell especial, separado do usuário ou dos shells de raiz. Este shell não tem acesso às mesmas variáveis PATH que os usuários. Portanto, ao executar um script como uma tarefa cron, há duas opções:

Especifique o caminho completo para cada comando no script (ou seja, caminho completo para o aptitude - o cron não sabe onde procurar para encontrar "apt-get")

Pouco truque que eu uso - ao escrever a linha de trabalho cron, mesmo no crontab ROOT, anexar sudo antes do caminho do script. Isso irá enganar o cron na execução do script a partir de um shell raiz em vez do shell cron, que lhe dará acesso a todas as variáveis PATH do root.

    
por 27.02.2016 / 12:54
1

Isso ocorre porque o cron está sendo executado como seu usuário sem privilégios, e os comandos apt-get exigem privilégios de elevação root (aka administração) para serem executados.

Uma alternativa é executar esse comando no crontab do usuário root :

sudo -i
<type user password>
crontab -e

O primeiro comando eleva todo o seu shell para o root e também - crucialmente - lhe dá acesso ao ambiente do root, em vez de apenas um único comando como seu usuário com privilégios elevados.

O segundo comando irá editar o crontab raiz, não o seu próprio.

    
por 31.01.2015 / 00:56