it-swarm-eu.dev

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

Potřebuji spustit něco jako Sudo bez hesla, takže jsem použil visudo a přidal jsem to do svého sudoers souboru:

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 root, aniž bych požadoval heslo?

175
LanceBaynes

V souboru sudoers máte další záznam, obvykle umístěný na /etc/sudoers, která také odpovídá vašemu uživateli. Aby toto pravidlo mělo přednost, musí být pravidlo NOPASSWD.

Když to uděláte, Sudo bude vyžadovat heslo normálně pro všechny příkazy kromě /path/to/my/program, což vám vždy umožní spustit bez vyžádání hesla.

97
Warren Young

Pokud je v /etc/sudoers, Sudo používá 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 konkrétní 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 program mohl být spuštěn jako root, ale ne jako ostatní uživatelé. (Nepřidávejte více povolení, než je požadováno minimum, pokud si neuvědomíte důsledky.)

Poznámka pro čtenáře, kteří nepoužívají Ubuntu nebo kteří změnili výchozí konfiguraci sudo (ve výchozím nastavení je Ubuntu Sudo v pořádku) : Spouštění skriptů Shell se zvýšenými oprávněními je riskantní, musíte začít z čistého prostředí (jakmile začne Shell, je příliš pozdě (viz Povolit setuid na skriptech Shell ), takže se o to musíte postarat Sudo)). Ujistěte se, že máte Defaults env_reset v /etc/sudoers nebo že tato volba je výchozí hodnota kompilace (Sudo sudo -V | grep env by mělo zahrnovat Reset the environment to a default set of variables).

[~ # ~] 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 s 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ěkteré příkazy, které může provádět pouze uživatel root nebo Sudo, jako je vytvoření složky 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í k provádění pomocí:

    Sudo chmod u+x create_dir.sh
    
  4. Proveďte změny, aby tento skript nevyžadoval heslo.

    1. Otevřete soubor sudoers:

      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 odejít.

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

    Sudo ./create_dir.sh
    

    Tím se spustí příkazy uvnitř souboru skriptu, aniž by se vyžadovalo heslo.

Postupujte podle jednoduchých kroků uvedených zde http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

24
M. Ahmad Zafar

Myslím, že vaše syntaxe je špatná. Alespoň používám následující, které pro mě fungují:

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

Pokud se chcete 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

Tím se příkaz spustí jako root bez potřeby Sudo.

6
linuxgnuru

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

Tento soubor je:

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

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

Do vybraného souboru můžete přidat následující řádky, abyste získali požadovanou konfiguraci:

Ignorovat ověření skupiny

%group ALL=(ALL) NOPASSWD: ALL

nebo Ignorovat ověření uživatele

youruser ALL=(ALL) NOPASSWD: ALL

nebo Ignorovat ověření spustitelného souboru pro konkrétního uživatele

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

RYCHLÁ POZNÁMKA: Otvíráte dveře, abyste mohli používat Sudo bez autentizace, to znamená, že můžete spustit vše, co mění vše z vašeho systému, používat je se zodpovědností.

5
Lyoneel

Ověřte, že Sudo není přezdívka. Běžte takto

/usr/bin/Sudo /path/to/my/program

Například alias Shell jako je tento:

alias Sudo="Sudo env PATH=$PATH"

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

4
Sepero

To vyřešilo problém pro mě (také vyzkoušel některé z dalších odpovědí, které by mohly pomoci):

Skript, na který jsem volal, byl v /usr/bin, do adresáře, ke kterému nemám oprávnění k zápisu (i když tam obvykle mohu číst všechny soubory). Skript byl chmodded + x (spustitelný permisison), ale stále to nefungovalo. Přesunutí tohoto souboru na cestu v domovském adresáři namísto /usr/bin, Nakonec jsem to mohl zavolat se Sudo bez zadání hesla.

Také něco, o čem jsem pochyboval (objasnění pro budoucí čtenáře): Musíte spustit skript jako Sudo. Zadejte Sudo, když volá skript. Nepoužívejte Sudo pro příkaz uvnitř skriptu, který skutečně potřebuje root (v mém případě mění podsvícení klávesnice). Možná to také funguje, ale nemusíte, a zdá se to jako lepší řešení.

2
Luc

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

pravit: Na základě vašeho komentáře k jiné odpovědi, kterou chcete spustit z ikony. Budete si muset vytvořit .desktop soubor, který spouští program se Sudo, stejně jako na terminálu.

Můžete také zvážit použití gtk-Sudo pro vizuální heslo Výzva.

Pravděpodobně byste měli zvážit myšlenku, že byste neměli spouštět věci jako root a že lepší cestou může být změna systému dále po silnici, abyste vůbec nepotřebovali oprávnění root.

2
Caleb

Další možností může být instalace, konfigurace a spuštění příkazu skript pomocí příkazu super

super /path/to/your/script

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

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

Použijete chmod u+s (read chmod (1) ) při instalaci takového binárního kódu.

Ale buďte velmi opatrní .

Před kódováním takové věci si přečtěte mnoho věcí o setuid , včetně Advanced Linux Programming .

Všimněte si, že skript nebo jakákoli Shebang - ed věc, nelze nastavit. Ale mohli byste kódovat (v C) malý setuid-binární obal.

1

V ideálním případě, pokud přizpůsobujete, jaké příkazy lze spouštět pomocí Sudo, měli byste tyto změny provádět v samostatném souboru pod /etc/sudoers.d/ Místo přímého upravování souboru sudoers. K úpravě souboru (souborů) byste také měli vždy použít visudo. Na příkazy NOPASSWD NIKDY byste NIKDY neměli udělovat ALL.

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

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

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

Můžete spustit příkaz Sudo -l A zobrazit oprávnění, která byla udělena vašemu uživateli, pokud se některý z uživatelsky specifických příkazů NOPASSWD objeví PŘED jakýmkoli příkazem %groupyouarein ALL=(ALL) ALL ve výstupu, který bude vyzváni k zadání hesla.

Pokud zjistíte, že vytváříte spoustu těchto souborů sudoers.d, možná budete chtít vytvořit názvy pojmenované podle uživatele, aby se snáze vizualizovaly. Mějte na paměti, že pořadí FILE NAMES a PRAVIDEL v souboru je velmi důležité, LAST one načte výhry, ať už je VÍCE nebo MÉNĚ přípustnější 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 na paměti, že pokud máte nějaké soubory, které nemají numerickou předponu, načtou se po očíslovaných souborech a přepíší nastavení. Důvodem je, že v závislosti na vašem jazykovém nastavení "lexikální třídění" Shell nejprve použije třídicí čísla a poté může prokládat velká a malá písmena při třídění v "vzestupném" pořadí.

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, Abyste zjistili, zda váš aktuální jazyk vytiskne AaBbCc atd. Nebo ABC, pak abc a určete, co bude nejlepší "poslední" msgstr "předpona k použití by byla.

0
dragon788

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

Instalace:

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

Níže je fragment kódu pro použití v python automatizace 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
0

Chcete-li dovolit libovolnému uživateli provádět program jako Sudo bez vyžádání hesla, můžete přidat následující řádek

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

v /etc/sudoers

Všimněte si, že % Sudo to zvládne.

0
ultimatex

Následuje případ, kdy chcete spusťte příkaz bez hesla, pouze pokud má specifickou sadu možností, kde je část možností proměnná. AFAIK není možné použít proměnné nebo rozsahy hodnot v deklarátech sudoerů, tj. Můžete explicitně povolit přístup k command option1, Ale ne command option2 Pomocí:

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

ale pokud je struktura command option1 value1, kde se value1 může lišit, budete muset mít explicitní řádky sudoers pro každou možnou hodnotu value1. Shell skript poskytuje způsob, jak to obejít.

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

  1. Vytvořte skript prostředí, ve kterém příkaz zavoláte, bez Sudo.
  2. Uložte skript do složky s oprávněním root (např. /usr/local/bin/), Udělejte soubor s oprávněním root (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 pro sudoery 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 zobrazení displeje v systému MacOS. To se provádí pomocí:

Sudo pmset displaysleep time_in_minutes

Považuji změnu časového limitu spánku za nevinnou akci, která neospravedlňuje potíže s zadáváním hesla, ale pmset může dělat mnoho věcí a rád bych tyto ostatní věci nechal za heslem Sudo.

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

#!/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ého skriptu je ověření vstupu, což není povinné, takže následující práce by také fungovala:

#!/bin/bash
pmset displaysleep $1 
0
Koit Saarevet