Jak spustit konkrétní program jako root bez výzvy k zadání hesla?

Potřebuji spustit něco jako sudo bez hesla, tak jsem použil visudo a přidal to do mého sudoers soubor:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program 

Pak jsem to vyzkoušel:

$ sudo /path/to/my/program [sudo] password for MYUSERNAME: 

Proč požaduje heslo? Jak mohu spouštět / používat příkazy jako root s uživatelem bez oprávnění root bez požadavku na heslo?

Odpovědět

Vy mít další záznam v sudoers souboru, obvykle umístěném na /etc/sudoers , který také odpovídá vašemu uživateli. Pravidlo NOPASSWD musí být za tímto pravidlem, aby mělo přednost.

Poté, sudo vyzve k zadání hesla normálně pro všechny příkazy kromě /path/to/my/program, které vám vždy umožní spustit bez požadavku na heslo.

Komentáře

  • bude to stále fungovat, pokud /path/to/my/program byl skript v Pythonu?
  • Může program místo toho být alias, nastavený pro bash (tj. v .bashrc)? Nebo dokonce shell skript uvnitř /usr/local/sbin? Vyzkoušet.
  • Nikos – ne, nemůže to být alias. Musí ukazovat na skutečnou cestu.
  • sudoers? kde je? je těžké použít vaši odpověď (
  • @VasiliiSuricov: ‚ s obvykle v /etc, ale některé systémy to uvádějí jinde. Pokud jej ‚ nenajdete, zkuste man sudoers. Místní umístění tohoto souboru by mělo být nahrazeno man stránka v době sudo byla vytvořena pro tento systém.

Odpovědět

Pokud je v /etc/sudoers více shodných položek, použije sudo poslední. Pokud tedy můžete provést jakýkoli příkaz s výzvou k zadání hesla, a chcete být schopni provést určitý příkaz bez výzvy k zadání hesla, potřebujete výjimku jako poslední.

myusername ALL = (ALL) ALL myusername ALL = (root) NOPASSWD: /path/to/my/program 

Všimněte si použití (root), aby bylo možné program spouštět jako root, ale ne jako ostatní uživatelé. (Pokud jste nevymysleli důsledky, nedávejte více oprávnění, než je nutné.)

Poznámka k re reklamy, které nepoužívají Ubuntu nebo které změnily výchozí konfiguraci sudo (sudo Ubuntu je ve výchozím nastavení v pořádku) : Spouštění shell skriptů se zvýšenými oprávněními je riskantní, musíte začít z čistého prostředí (jakmile shell byl spuštěn, je příliš pozdě (viz Povolit setuid ve skriptech prostředí ), takže se o to musíte postarat sudo). Ujistěte se, že máte Defaults env_reset v /etc/sudoers nebo že je tato možnost výchozí v době kompilace (sudo sudo -V | grep env by měl obsahovat Reset the environment to a default set of variables).

Komentáře

  • ex pro přechod root z jhon s sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Pokud chcete povolit libovolné příkazy jako root, udělejte to john ALL=(ALL) NOPASSWD: all. ‚ Nemá smysl jít přes su.
  • Otázka: Mám změnit oprávnění svého skriptu aby bylo možné z důvodu bezpečnosti upravit a číst pouze uživatele root ‚ Přemýšlím o útočníkovi, který upravuje skript, který má všechna oprávnění udělená bez nutnosti hesla, takže si může dělat, co chce. Útočník samozřejmě nemůže ‚ přečíst ani soubor sudoers, aby zjistil, které skripty mají toto oprávnění, ale může se všemi mými vlastními skripty pokusit, jakmile najde složku, ve které jsou uloženy v naději, že některé jsou povoleny, nebo něco podobného.
  • @JeffreyLebowski Pokud máte pravidlo sudo, které spouští skript (přímo nebo nepřímo), pak ‚ je zásadní, aby do souboru skriptu a do adresáře obsahujícího soubor skriptu a do jeho nadřazeného adresáře mohli zapisovat pouze uživatelé root (nebo lidé, kteří mají oprávnění root). Nezáleží na tom ‚, že si soubor skriptu může přečíst kdokoli (pokud neobsahuje heslo nebo něco, ale ‚ je špatný nápad, pokud je ‚ sa heslo, mělo by být ve vlastním souboru, jinak je ‚ příliš velké riziko náhodného úniku, např. kopírováním vložení této části kódu do otázky na tomto webu).
  • @alper Ne. Restartování vyžaduje jen velmi málo věcí. Po změně sudoers nemusíte ‚ dělat nic zvláštního: sudo to zkontroluje pokaždé.

Odpověď

VAROVÁNÍ : Tato odpověď byla považována za nejistou. Viz komentáře níže

Kompletní řešení: Následující kroky vám pomohou dosáhnout požadovaného výstupu:

  1. Vytvořte nový soubor skriptu (nahraďte create_dir.sh požadovaným názvem skriptu):

    vim ~/create_dir.sh 

    Skript bude vytvořen v domovském adresáři uživatele.

  2. Přidejte několik příkazů, které obsahují pouze root nebo sudo uživatel může spouštět jako vytváření složek na úrovni kořenového adresáře:

    mkdir /abc 

    Poznámka: K těmto příkazům nepřidávejte sudo. Uložit a ukončit (pomocí :wq!)

  3. Přiřaďte mu oprávnění ke spuštění pomocí:

    sudo chmod u+x create_dir.sh 
  4. Provádějte změny, aby tento skript nevyžaduje heslo.

    1. Otevřete sudoers soubor:

      sudo visudo -f /etc/sudoers 
    2. Na konec přidejte následující řádek:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh 

      Nahraďte ahmad jakýmkoli uživatelským jménem. Také se ujistěte, že se jedná o poslední řádek. Uložit a ukončit.

  5. Nyní při spuštění příkazu přidejte sudo před takto:

    sudo ./create_dir.sh 

    Tím se spustí příkazy uvnitř souboru skriptu bez zadání hesla.

Postupujte podle pokynů zde uvedené kroky http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

Komentáře

  • Bylo by lepší, kdybyste zde zadali příslušné kroky a použili odkaz jako zálohu pro podrobnější informace. Tímto způsobem si vaše odpověď uchová možnou hodnotu, i když tento odkaz již nebude platný.
  • Tato rada je nejistá. Část sudo části sudo chmod u+x create_dir.sh je zbytečná, protože uživatel má (pravděpodobně) vlastnictví svého domovského adresáře. Protože uživatel může zapisovat do create_dir.sh, účinně jste tomuto uživateli poskytli kořenový shell zdarma.
  • @Lekensteyn Což znamená také libovolný program běžící jako uživatel . Mohlo by to také umožnit uživateli spustit cokoli se sudo bez hesla.
  • Chybí mi něco? Věřím, že celá chmod je zbytečná, protože spoléháte na to, že sudo povýší vaše oprávnění.

Odpověď

Myslím, že vaše syntaxe není správná. Přinejmenším používám následující, které pro mě funguje:

myusername ALL=(ALL) NOPASSWD: /path/to/executable 

Komentáře

  • The (ALL) část je volitelná, její vynechání má přesně stejný účinek. Mít (root) by však bylo lepší, ale jeho absence nevysvětluje ‚ problém.
  • +1 pro sudo pro tento příkaz a nic jiného! Není důvod rozbít celý systém …
  • @Jan: To už byla otázka.

Odpovědět

Chcete-li se vyhnout nutnosti používat sudo ani měnit konfigurační soubor sudoers, můžete použít:

sudo chown root:root path/to/command/COMMAND_NAME sudo chmod 4775 path/to/command/COMMAND_NAME 

Toto provede příkaz jako root bez nutnosti sudo.

Komentáře

  • Páni, nikdy jsem o tomto řešení neslyšel, vadilo by to
  • @RyanNerd: Toto není bezpečné řešení. Nejen, že OP může nyní spustit příkaz jako root bez hesla, koupit kdokoli může nyní spustit příkaz jako uživatel root.
  • “ chmod 4775 název souboru “ je jedna cesta. Zadruhé, možná lepší způsob, jak SETUID , aniž byste předefinovali oprávnění celého souboru, je “ chmod u + s název souboru “
  • sudo chmod 005 je bezpečný. ‚ Nechcete udělit oprávnění k zápisu aktuálnímu uživateli. Jinak by kdokoli na vaší relaci mohl s vaším skriptem dělat cokoli.

Odpovědět

Pokud máte distribuci jako Manjaro , musíte se nejprve vypořádat se souborem, který přepíše definici / etc / sudoers, můžete jej smazat nebo s tímto souborem pracovat přímo a přidávat nové konfigurace.

Tento soubor je:

sudo cat /etc/sudoers.d/10-installer 

POUZE způsob, jak to vidět, je pod oprávněním root, bez něj nemůžete vypsat tento adresář, tento soubor je specifický pro Manjaro, můžete najít tuto konfiguraci s jiným názvem , ale ve stejném adresáři.

V souboru, který si vyberete, můžete přidat následující řádky, abyste získali požadovanou konfiguraci:

Ignorovat ověřování pro skupinu

%group ALL=(ALL) NOPASSWD: ALL 

nebo Ignorovat autentizaci uživatele

youruser ALL=(ALL) NOPASSWD: ALL 

nebo Ignorovat autentizaci spustitelného souboru pro konkrétního uživatele

youruser ALL=(ALL) NOPASSWD: /path/to/executable 

RYCHLÁ POZNÁMKA: Otevíráte dveře k používání SUDO bez ověření, to znamená, že můžete spustit vše, co upravuje vše ve vašem systému, používejte to s odpovědností.

Odpovědět

Ověřte, že sudo není aliasy. Spustit takto

/usr/bin/sudo /path/to/my/program 

Například alias prostředí, jako je tento:

alias sudo="sudo env PATH=$PATH" 

může toto chování způsobit.

Komentáře

  • Máte pravdu, můj komentář byl zde mimo provoz, omlouvám se za to . Přesto mě ‚ m zaujalo – jak očekáváte, že aliasing změní zpracování sudoers sudo. Nebo mluvíte o přesměrování sudo na něco, co tuto chybovou zprávu vždy vytiskne, aby byla načtena hesla? To je v tomto případě nepravděpodobné …
  • Měl jsem stejný problém jako OP. Ukázalo se, že to bylo způsobeno tím, že alias sudo="sudo env PATH=$PATH" v mém ~/.bashrc. Spíše než to vyřešit sám pro sebe a slepě se věnovat své práci, předložil jsem svou odpověď jako možné řešení pro kohokoli jiného, kdo přichází v tomto vlákně.
  • To ‚ s v pořádku, ale když to není zřejmé (což v tomto případě není alespoň pro některé lidi ‚ t), je dobré dát do odpovědi vysvětlení, které poskytne určitý kontext a zabránit lidem ve slepém používání magických zaklínadel. +2 (- (- 1) + +1). 🙂

Odpověď

Když spustíte skript, musíte jej spustit jako sudo /path/to/my/script.

Upravit: Na základě vašeho komentáře k jiné odpovědi jej chcete spustit z ikony. Budete muset vytvořit soubor .desktop, který spustí váš program pomocí sudo, stejně jako na terminálu.

Můžete také zvážit použití gtk-sudo pro vizuální výzvu k zadání hesla.

Pravděpodobně byste měli uvažovat o myšlence, že byste neměli spouštět věci jako root a že byste změnili systém dále po silnici, abyste nemuseli vůbec potřebovat oprávnění root by byl lepší způsob.

Komentáře

  • Nevytvářejte skripty prostředí setuid . Viz Povolit setuid na skriptech prostředí .
  • Zvažoval jsem to ani nezmínit, protože ‚ je tak špatná volba. Právě jsem ji smazal, protože jsem se ‚ obával, že by tento žadatel mohl použít radu i s varováním, že to byla špatná rada!

Odpověď

Tím se problém vyřešil za mě (také jsem vyzkoušel některé z dalších odpovědí, které by mohly pomoci):

Skript, který jsem volal byl v /usr/bin, adresáři, do kterého nemám oprávnění k zápisu (i když tam obvykle mohu číst libovolné soubory). Skript byl chmodded + x (spustitelné oprávnění), ale stále nepracoval. Přesunutím tohoto souboru na cestu v mém domovském adresáři jsem místo /usr/bin konečně mohl volat sudo bez zadání hesla.

Také něco, co jsem pochybnosti o (objasnění pro budoucí čtenáře): Musíte spustit svůj skript jako sudo. Při volání skriptu zadejte sudo. Nepoužívejte sudo pro příkaz uvnitř skriptu, který skutečně potřebuje root (v mém případě změna podsvícení klávesnice). Možná to také funguje, ale nemusíte, a to vypadá jako lepší řešení, než ne.

Komentáře

  • Druhý odstavec měl odpověď na můj problém
  • @MuhammadAhmadZafar rád pomohlo to!
  • Ve skutečnosti je použití sudo uvnitř skriptu naprosto v pořádku, pokud máte příslušná práva (nastavená v sudoers) pro spuštění příslušného příkazu bez hesla. Díky tomu jsou věci trochu bezpečnější.
  • Tuto odpověď můžete skutečně přepsat jako podrobný ‚ takto to děláte ‚ spíše než jako dialog s ostatními odpověďmi
  • @WalrustheCat Dobrá poznámka. Když jsem si znovu přečetl svou odpověď, myslím, že jsem sám mohl být trochu zmatený. Právě teď si ale ‚ nepamatuji, jaká byla přesná situace, takže nemohu ‚ opravdu udělat lepší zápis. Pokud na to přijdete, možná kombinací několika odpovědí, každopádně odešlete novou odpověď!

Odpověď

Další možností může být instalace, konfigurace a použití super příkaz pro spuštění skriptu jako

super /path/to/your/script 

Pokud chcete spustit nějaký binární spustitelný soubor (např. Že jste z nějakého zdrojového kódu C zkompilovali ELF ) – který je ne skript – jako root, můžete zvážit vytvoření setuid (a ve skutečnosti /bin/login, /usr/bin/sudo a /bin/su a super používají tuto techniku). Buďte však velmi opatrní, můžete otevřít obrovskou bezpečnostní díru .

Konkrétně by váš program měl být paranoicky kódován (takže před “ jednáním “ za předpokladu potenciálně nepřátelského uživatele zkontrolujte všechny argumenty a prostředí a vnější podmínky), pak vy může používat seteuid (2) a přátele (viz také setreuid (2) ) opatrně ( viz také schopnosti (7) & pověření (7) & execve (2) …)

Vy budete použijte chmod u+s (přečtěte si chmod (1) ) při instalaci takového binárního souboru.

Ale buďte velmi opatrní .

Přečtěte si mnoho věcí o setuid , včetně Advanced Linu x Programování , než něco takového naprogramujete.

Všimněte si, že skript nebo jakýkoli shebang -ed věc nelze nastavit. Ale můžete kódovat (v C) malý binární soubor setuid, který jej zabalí.

Uvědomte si, že v systému Linux kód aplikace interaguje s linuxovým jádrem pomocí syscalls (2) . Většina z nich může selhat, viz errno (3) . Mnoho aplikací pro Linux (např. GNU bash , GNU make , GNU gdb , GNOME ) jsou open source: můžete si je stáhnout, prostudovat a přispívat do jejich zdrojového kódu.

Komentáře

  • Pokročilé programování v systému Linux je mrtvý odkaz.

Odpověď

V ideálním případě, pokud upravujete, jaké příkazy lze spustit pomocí sudo, měli byste tyto změny provádět v samostatném souboru pod /etc/sudoers.d/ místo přímé úpravy souboru sudoers. K úpravě souborů byste měli vždy použít visudo. NIKDY byste neměli udělovat NOPASSWD na ALL příkazy.

Příklad: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Vložte oprávnění k udělení řádku: myuser ALL= NOPASSWD: /path/to/your/program

Poté uložte a ukončete a visudo upozorní vás, pokud máte nějaké syntaktické chyby.

Můžete spustit sudo -l a zobrazit oprávnění, která vašemu uživateli byla udělena, pokud existují konkrétní NOPASSWD příkazy se objeví PŘED jakýmkoli %groupyouarein ALL=(ALL) ALL výstupem, budete vyzváni k zadání hesla.

Pokud najdete sami vytváříte spoustu těchto souborů sudoers.d, pak je možná budete chtít vytvořit pojmenované podle jednotlivých uživatelů, aby byly snáze vizualizovatelné. Mějte na paměti, že řazení NÁZVŮ SOUBORŮ a PRAVIDEL v souboru je velmi důležité, vyhrává POSLEDNÍ, ať už je VÍCE nebo MÉNĚ tolerantní než předchozí položky.

Řazení názvů souborů můžete ovládat pomocí předpony 00-99 nebo aa / bb / cc, ale mějte také na paměti, že pokud máte JAKÉKOLI soubory, které nemají číselnou předponu, načte se po očíslovaných souborech, přepíše nastavení. Důvodem je, že v závislosti na vašem nastavení jazyka používá „lexikální třídění“ prostředí nejprve třídění čísel a poté může při třídění ve vzestupném pořadí prokládat velká a malá písmena.

Zkuste spustit printf "%s\n" {{0..99},{A-Z},{a-z}} | sort a printf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sort a zjistit, zda váš aktuální jazyk vytiskne AaBbCc atd. nebo ABC poté abc určit, která nejlepší „poslední“ předpona písmene bude použita be.

Odpovědět

Chcete-li umožnit libovolnému uživateli spustit program jako sudo bez zadání hesla, můžete přidat následující řádek

%sudo ALL=(root) NOPASSWD: /path/to/your/program

v /etc/sudoers

Upozorňujeme, že % sudo to zvládne.

Komentáře

  • Zatímco ‚ je jedním ze způsobů, jak dosáhnout pravidla sudo, ‚ n neodpovídá na otázku, proč nastavení příznaku NOPASSWD u tohoto pravidla stále vedlo k výzvě k zadání hesla. V přijaté odpovědi najdete představu, proč se to stalo.

Odpověď

Následující příklad platí pro případ, že chcete spustit příkaz bez hesla, pouze pokud má konkrétní sadu možností, kde je část možností proměnná . AFAIK není možné používat proměnné nebo rozsahy hodnot v deklaracích sudoers, tj. Můžete povolit přístup explicitně command option1, ale ne command option2 pomocí:

user_name ALL=(root) /usr/bin/command option1

ale pokud je struktura command option1 value1, kde value1 se může lišit, pro každou možnou hodnotu value1 byste museli mít explicitní řádky sudoers. Prostřednictvím skriptu Shell to lze obejít.

Tato odpověď byla inspirována odpovědí M. Ahmada Zafara a opravuje tam problém se zabezpečením.

  1. Vytvořte skript prostředí, kde zavolejte příkaz bez sudo.
  2. Uložte skript do kořenově chráněné složky (např. /usr/local/bin/), proveďte soubor vlastněný rootem (např. chown root:wheel /usr/local/bin/script_name) bez přístupu pro ostatní (např. chmod 755 /usr/local/bin/script_name).
  3. Přidejte výjimku sudoers pomocí visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Spusťte skript sudo script_name.

Například chci změnit časový limit vypnutí displeje v systému macOS. To se provádí pomocí:

sudo pmset displaysleep time_in_minutes

Změnu časového limitu spánku považuji za nevinnou akci, která neodůvodňuje potíže se zadáváním hesla, ale pmset umí mnoho věcí a rád bych tyto další věci nechal za heslem sudo.

Takže mám následující skript na /usr/local/bin/ds:

 #!/bin/bash if [ $# -eq 0 ]; then echo "To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"" else if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then pmset displaysleep $1 else echo "Time must be 0..180, where 0 = never, 1..180 = number of minutes" fi fi  

Na konci souboru sudoers mám následující řádek:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Chcete-li nastavit časový limit na 3 minuty, spustím skript z běžného uživatelského účtu user_name:

sudo ds 3

PS Většina mých skriptů je validace vstupu, která není povinná, takže by fungovalo i následující:

 #!/bin/bash pmset displaysleep $1  

Odpověď

Alternativně můžete použít python balíček pudo .

Instalace:

user$ sudo -H pip3 install pudo # you can install using pip2 also 

Níže je uveden fragment kódu pro použití v automatizaci pythonu pro spouštění příkazů pod oprávněním root:

user$ python3 # or python2 >>> import pudo >>> (ret, out) = pudo.run(("ls", "/root")) # or pudo.run("ls /root") >>> print(ret) >>> 0 >>> print(out) >>> b"Desktop\nDownloads\nPictures\nMusic\n" 

Níže je uveden příklad cmd pro spouštění příkazů pod oprávněním root:

user$ pudo ls /root Desktop Downloads Pictures Music 

odpověď

Ve skriptu sudoers, který je uvnitř / etc / uncomment, níže uvedený řádek:

#includedir /etc/sudoers.d

Vytvořte jeden soubor s libovolným názvem v adresáři /etc/sudoers.d/ a přidejte obsah, jak je uvedeno v maximálním počtu odpovědí. Jako pro všechny uživatele jako root

#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

Toto je nejbezpečnější způsob spuštění skriptu s oprávněním root.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *