Z nějakého důvodu potřebuji jako uživatel spustit bez Sudo skript script.sh, který potřebuje oprávnění root.
Viděl jsem jako jediné řešení, jak dát Sudo INSIDE script.sh. Vezměme si příklad:
script.sh :
#!/bin/sh
Sudo apt-get update
Samozřejmě, pokud provedu tento skript, dostanu výzvu k zadání hesla. Pak jsem do souboru sudoers (na konci přepsal všechno ostatní) přidal:
user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
Mimochodem, také jsem vyzkoušel linku:
user ALL=(ALL) NOPASSWD:/path/to/script.sh
(Myslím, že jsem ten rozdíl nepochopil)
To ale nevyřeší můj problém, pokud nepoužívám Sudo k provedení tohoto skriptu:
# ./script.sh
[Sudo] password for user:
# Sudo ./script.sh
Starts updating...
No, tak si říkám "Ok, to znamená, že pokud mám soubor odkazovaný v sudoers jako já, bude to fungovat bez Promptu jen tehdy, když mu zavolám s Sudo, co není to, co chci.".
Takže, ok, vytvořím další skript script2.sh takto:
script2.sh
#!/bin/sh
Sudo /path/to/script.sh
Fakticky to funguje. Nejsem však opravdu spokojen s tímto řešením, zejména tím, že musím použít 2 skripty pro každý příkaz.
Tento příspěvek je pak pro pomoc lidem, kteří mají tento problém a hledají stejné řešení (nenašel jsem na něm dobrý příspěvek) a možná máte lepší řešení od vás.
Podělte se o své nápady!
EDIT 1:
Chci trvat na tom, že tento "apt-get update" byl jen příklad FAR z toho, co vlastně můj scénář je. Můj skript má spoustu příkazů (s některými konfiguračními soubory typu cd-root-access-only) a řešení nemůže být "No, prostě to udělejte přímo s apt-get".
Principem příkladu je pomoci porozumění, ne omluvit zjednodušení odpovědi na obecný problém.
Pokud chcete spustit Sudo /usr/bin/apt-get update
bez hesla, musíte mít položku sudoers:
user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
Pro větší otázku scénáře jako celku existují dva možné přístupy:
Pro každý příkaz ve skriptu, který potřebuje Sudo
, vytvořte řádek v sudoers
specificky pro tento příkaz. V tomto případě lze skript zavolat normálně:
./script1.sh
Umístěte řádek do sudoers
pro skript jako celek. Když je toto provedeno, jednotlivé příkazy nepotřebují Sudo
. Sudo
však musí být použito ke spuštění skriptu jako v:
Sudo ./script.sh
Z mého blogu: IDMRockstar.com :
Kicker je, že někdy musím spouštět příkazy jako root. Zde je rychlý a špinavý způsob, jak toho dosáhnu, aniž bych prozradil hesla:
#! /bin/bash
read -s -p "Enter Password for Sudo: " sudoPW
echo $sudoPW | Sudo -S yum update
Tímto způsobem je uživatel vyzván k zadání hesla (a skrytého z terminálu) a poté podle potřeby předán do příkazů, takže nemám celý skript spuštěn jako root =)
Pokud máte lepší způsob, rád bych to slyšel! Nejsem v žádném případě expert na skriptování Shell.
Na zdraví!
.: Adam
Pokud vaše heslo není něco, o čem chcete být v bezpečí (možná nějaký testovací server ve firmě atd.), Můžete ve skriptu povýšit na Sudo přes echo jako:
echo YourPasswordHere | Sudo -S Command
Výzva stále vytiskne text "Zadejte heslo" pro výstup. Takže neočekávejte, že bude elegantní.
Zobrazit Askubuntu post
Jak jste si poznamenali, soubor, který se musí zobrazit v konfiguraci sudoers, je soubor, který je spuštěn Sudo
, a nikoli soubor, který běží Sudo
.
To, co říkáme, to, co často děláme, má něco podobného
user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
v konfiguraci Sudo
, kde script.sh
má všechny příkazy, které má skript udělat.
Pak definujeme buď funkci Bash nebo alias, takže script.sh
je vlastně
Sudo /path/to/script.sh
Jediným problémem je, že některé příkazy nesmějí být spouštěny jako root, ale musíte do skriptu vložit některé příkazy su - user -c "command"
.
Navrhuji, abyste se podívali na proměnné prostředí Sudo - konkrétně můžete použít (a zkontrolovat) $ Sudo_USER. Zavolej svůj skript s Sudo (1 záznam v sudoers), pak udělejte věci jako Sudo_USER a root jako root.
Jednoduše, aby bylo možné vykonávat příkazy jako root, musíte použít su (i Sudo používá su) Dokud úspěšně spouštíte Sudo ./script2.sh jen místo toho: Sudo su "#" // příkazy jako root zde "#" exit // příkazy jako zde můžete vytvořit funkci Shell s názvem Sudo, ale žádné jiné lepší způsob, jak si myslím, ale je to v případě skriptů inti, rc Android ..etc musí být uklizené;)
nicméně toto vyžaduje, abyste NOPASSWD: su wich je totálně bezpečný
jakýmkoliv způsobem zde chybí princip POISX oprávnění, který je filtrování, takže dont povolit něco všem uživatelům nebo naopak jednoduše, volejte Sudo tolik, kolik chcete s žádnou další věc pak:
chown root script.sh
chmod 0755 script.sh
chgrp Sudo script.sh
"vytvořit kořenového vlastníka .sh" "učinit jej pouze pro čtení a exec pro ostatní" "a umístit ho do Sudo skupiny" samozřejmě pod Súdem a je to
V novém souboru /etc/sudoers.d/apt-get vložte jeden řádek:
user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
Zde je vyžadována úplná cesta ke spustitelnému souboru.
Ve skriptu pak použijte následující:
Sudo apt-get update
Zde není vyžadován úplný název. Sudo používá pro spustitelné rozlišení proměnnou prostředí PATH.
Při změně a kontrole konfigurace sudoers se ujistěte, že pro obnovu chyb zůstane otevřená další kořenová relace.