Jak mohu sudo zadat příkaz do skriptu bez požadavku na heslo?

101

Chci systém automaticky zapnout každý den. Používám níže uvedený kód ve svém Python skriptu, alesudo se mě pokaždé zeptá na heslo:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

Jak mohu spustit tento skript bezsudo žádáte heslo vždy?

    
dané Viswa 25.06.2012 15:30

5 odpovědí

138
  

Upozorňujeme: Jakákoli metoda, která zahrnuje zadání přihlašovacího hesla v prostém textu, příkazu nebo souboru, je nejistá a neměla by se používat!

Správná cesta provedete nastavení souborusudo tak, že pouze může být spuštěn jeden specifický příkaz, tj.echo date... > rtc... Heslo.

Krok 1. Vytvořte shell skript pouze s tímto příkazem

  • Otevřetegedit (nebo váš oblíbený editor) a vytvořte skript např. pydatertc.sh
  • Vložte pouze tento řádek a uložte ho např. váš domovský adresář:
    echo date \'+%s\' -d \'+ 24 hours\' > /sys/class/rtc/rtc0/wakealarm
  • Ukončete editor a z terminálu proveďte skript spustitelný a změňte jeho vlastnost na root , jinak by mohl jiný uživatel s přístupem k vašemu systému upravit spusťte příkazy root bez nutnosti zadání hesla:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Krok 2. Nastavte sudo, aby bylo možné spustitpydatertc.sh bez vyžadování hesla

  • Na terminálu zadejtesudo visudo a otevřete soubor% s_kde% (sudoers)
  • Kolem řádku 25 uvidíte tento řádek:%sudo ALL=(ALL:ALL) ALL
  • Pod tímto řádkem vložte následující řádek, kdeusername je vaše uživatelské jméno:
    username  ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • nano )

Krok 3. Upravte svůj skript pythonu volánípydatertc.sh

  • Změňte řádek na:
    os.system('sudo /home/username/pydatertc.sh')

Nyní by měl být váš skript spuštěn bez vyžadování hesla A bez ohrožení bezpečnosti vašeho účtu, dat nebo vašeho systému!

Alternativa pouze prowakealarm (ne pro běžné použití!):

Pouze v tomto konkrétním případě , jelikož soubor/sys/class/rtc/rtc0/wakealarm řídí pouze budíkový poplach pro systém a je jinak neškodný, další alternativou k vyloučení hesla je buď převzetí vlastnictví soubor schown (pokud jste jediným uživatelským nastavením poplachu) nebo jej můžete zapisovat do světa schmod +666; v takovém případě jednoduše odebertesudo z volání Pythonu a ponechatsh -c "...." neporušený.

    
odpověděl ish 25.06.2012 16:53
29
  

Upozornění!

     

Zadání přihlašovacího hesla v prostém textu, příkazu nebo souboru je extrémně neisté a může ohrozit vaše soukromá data a váš systém. Je to vysoce doporučeno nikdy to udělat, i když si myslíte, že váš systém je "osobní" nebo "bezpečný"!

Pokud je skript pouze pro osobní potřebu a máte jej umístěn na bezpečném místě a nemáte strach, že by váš účet byl ukraden a takový, pak je to jednoduché řešení:

echo LOGINPASSWD | sudo -S COMMAND HERE

, kde LOGINPASSWD je vaše přihlašovací heslo (příklad: iloveponies) a COMMAND TERE je váš příkaz, který přijde po sudo, jako sh -c "echo da .. atd

    
odpověděl hytromo 25.06.2012 15:38
21

Pokud vám nevadí skript spuštěný v určitou dobu v hodině (nebo během dne), vložte jej do domovského adresáře kořenového adresáře (/root) a spusťte skript ze systému crontab (/etc/crontab ) jako kořen. Pak nebudete muset kompromitovat bezpečnost.

Projděte si Odkaz o tom, jak přidat skript do crontabu.

    
odpověděl z7sg 25.06.2012 15:49
11

Další příbuzná pěkná vlastnost sudo, která nebyla uvedena ve vynikajících výše uvedených odpovědích, je proměnná 'timestamp_timeout'. Jedná se o proměnnou sudo, kterou můžete zvýšit, abyste ušetřili interaktivní typování heslem.

Příklad v souboru / etc / sudoers (nebo v jednom ze souvisejících souborů) můžete upravit výchozí:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

Úplný popis z "muž sudoers":

  

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

Samozřejmě, to nemůže pomoci v konkrétním případě spuštění příkazu z cronu. Ale je dobré si být vědom.

    
odpověděl arielf 29.06.2012 23:10
1
export MY_SUDO_PASS="user_password_here"

Otestujte, zda je to typ práce:

echo $MY_SUDO_PASS
> user_password_here

Spusťte "sudo apt-get update" a přijměte heslo z proměnných prostředí, které jsme vytvořili dříve:

echo $MY_SUDO_PASS | sudo -S apt-get update

Spustit z pythonu (například změna vlastnictví adresáře rekurzívně na username_here):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS dostat heslo -S přepnout zachycení a předání hesla do sudo

    
odpověděl Jozsef Turi 15.03.2018 17:59