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
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řessu
. - 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:
-
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.
-
Přidejte několik příkazů, které obsahují pouze
root
nebosudo
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!
) -
Přiřaďte mu oprávnění ke spuštění pomocí:
sudo chmod u+x create_dir.sh
-
Provádějte změny, aby tento skript nevyžaduje heslo.
-
Otevřete
sudoers
soubor: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 ukončit.
-
-
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
částisudo 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 docreate_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, žesudo
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á vsudoers
) 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.
- Vytvořte skript prostředí, kde zavolejte příkaz bez
sudo
. - 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
). -
Přidejte výjimku sudoers 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 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.
/path/to/my/program
byl skript v Pythonu?.bashrc
)? Nebo dokonce shell skript uvnitř/usr/local/sbin
? Vyzkoušet./etc
, ale některé systémy to uvádějí jinde. Pokud jej ‚ nenajdete, zkusteman sudoers
. Místní umístění tohoto souboru by mělo být nahrazenoman
stránka v doběsudo
byla vytvořena pro tento systém.