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?
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.
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
).
Kompletní řešení: Následující kroky vám pomohou dosáhnout požadovaného výstupu:
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
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!
)
Přiřaďte mu oprávnění k provádění pomocí:
Sudo chmod u+x create_dir.sh
Proveďte změny, aby tento skript nevyžadoval heslo.
Otevřete soubor sudoers
:
Sudo visudo -f /etc/sudoers
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.
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/
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
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.
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í.
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í.
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í.
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.
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.
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.
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
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.
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.
Sudo
./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
).Přidejte výjimku pro sudoery pomocí visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
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