it-swarm-eu.dev

Použijte Sudo bez hesla INSIDE skript

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.

27
Nilexys

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:

Přístup 1

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

Přístup 2

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
16
John1024

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

7
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

7
Eaton Emmerich

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".

5
damienfrancois

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.

2
bryn

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

1
Youssef

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.

0
Basilevs