SUDO a cron
Zveřejněno: 10. 03. 2014 | Autor: Petr Šafařík
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.