Síla myšlenky je neviditelná jako semeno, ze kterého vyroste obrovský strom. Je však příčinou viditelných změn v životě člověka. (L.N.Tolstoj)

SUDO a cron

Zveřejněno: 10. 03. 2014 | Autor:
Kategorie: Linux

V rámci práce na skriptu pro hlídání fotovoltaické elektrárny a úpravy spotřeby jsem řešil následující problém. Skript pro fotovoltaiku (FVEread) mimo jiné umí hlídat i jeden proces, který je nutné spustit pod uživatelem root.

/etc/init.d/telldusd restart

Toto udělá restart služby. Pokud chcete spouštět toto jen jako root, tak je všechno vpořádku a nemusíte nic řešit. Můj skript ovšem funguje pod uživatelem fve. Uživatel fve ovšem nesmí tuto službu restartovat.

Nejjednodušší je povolit uživateli právo k sudo pro restart služby (v tomto případě v režimu NOPASSWD, kdy nebude vyžadováno heslo uživatele.

fve  ALL=NOPASSWD: /etc/init.d/telldusd *

a v tuto chvíli můžete udělat

sudo /etc/init.d/telldusd restart

Ale co v případě, že tento skript je pouštěn z cronu? Zjistíte, že takovýto skript nefunguje. Důvod je, že sudo v běžné konfiguraci potřebuje terminál (stejně tak to je v případě například ssh — zkuste si schválně

ssh localhost "sudo touch /etc/tentosouborsmaz"

Nejspíše dostanete zpět hlášku o tom, že váš uživatel nemá oprávnění k sudo. Ovšem pokud spustíte ssh s parametrem -t, najednou se vše opraví.

[petos@owl ~]$ ssh petos@localhost "sudo touch /etc/tentosouborsmaz"
sudo: sorry, you must have a tty to run sudo
[petos@owl ~]$ ssh -t petos@localhost "sudo touch /etc/tentosouborsmaz"
Connection to localhost closed.

A v /etc/ naleznete soubor tentosouborsmaz. Jak sám prosí smažte jej…

Zpět k problému: vše je v nastavení SUDO. Je nutné specifikovat, že daný uživatel (v mém případě fve) nepotřebuje pro spuštění sudo terminál. Vše se nastavuje opět ve visudo, kde se jednoduše doplní pod řádek Defaults requiretty ještě jeden: Defaults:UZIVATEL !requiretty, kde UZIVATEL je ten uživatel, který se má nastavit. V mém případě uživatele fve to tedy je:

Defaults      requiretty
Defaults:fve  !requiretty

Stačí uložit… a je to.