Představte si tento scénář. Spravujete server Linux, ke kterému přistupuje více uživatelů. Všichni uživatelé mají sudo
práv. Chcete otestovat určité příkazy Linuxu s různými uživateli. jak bys to udělal? Přihlaste se jako jeden uživatel a otestujte příkazy a poté se odhlaste a znovu přihlaste jako jiný uživatel a otestujte příkazy? Ano, je to jeden způsob, jak to udělat. Existuje však jednoduchý způsob, jak spouštět příkazy jako jiný uživatel přes sudo v Linuxu. Čtěte dále a dozvíte se to.
Pro účely této příručky jsem vytvořil dva uživatelské účty, konkrétně "senthil" a "kumar" v mém testovacím stroji AlmaLinux 8. Budu používat „senthil“ jako aktuálního uživatele a „kumar“ jako cílového uživatele.
Chci, aby uživatel „senthil“ mohl spouštět jakýkoli příkaz jako uživatel „kumar“ na libovolném hostiteli, aniž by se ve skutečnosti přihlašoval jako „kumar“. Rozuměl? Dovolte mi ukázat vám příklad.
Spouštět příkazy jako jiný uživatel prostřednictvím sudo
Momentálně jsem přihlášen jako uživatel "senthil". Dovolte mi ukázat vám aktuálně přihlášeného uživatele pomocí whoami
příkaz.
$ whoami senthil
Nyní spustím jednoduchý "echo
" pomocí sudo
jako cílový uživatel "kumar" při přihlášení jako "senthil":
$ sudo -u kumar bash -c 'echo "My Username is $USER, and my user ID is $UID"'
Budete vyzváni k zadání hesla aktuálního uživatele (v tomto případě „senthil“). Po ověření se zobrazí echo
příkaz bude spuštěn jako uživatel "kumar" a zobrazí uživatelské jméno a ID uživatele "kumar".
Ukázkový výstup:
[sudo] password for senthil: My Username is kumar, and my user ID is 1001
Ve skutečnosti jsme právě provedli „echo
" jako uživatel "kumar", zatímco jsme se přihlásili jako "senthil". Proto vidíte uživatelské jméno a ID uživatele kumar, ale ne senthil.
Ověřte, zda je uid uživatele "kumar" správné pomocí id
příkaz.
$ id kumar uid=1001(kumar) gid=1001(kumar) groups=1001(kumar),10(wheel)
Ano, uid kumar je správný v obou výstupech.
Zde je -u
příznak se používá ke spuštění daného příkazu jako jiný uživatel (v tomto případě kumar) a bash -c
se používá k uvedení názvu příkazu. Příkaz byste měli zmínit v jednoduchých uvozovkách.
Pokud nepoužijete bash -c
možnost echo
příkaz vrátí uživatelské jméno a uid aktuálního uživatele namísto cílového uživatele.
$ sudo -u kumar echo "My Username is $USER, and my user ID is $UID"
My Username is senthil, and my user ID is 1000
Podobně můžete spouštět libovolné příkazy jako jiný uživatel.
Upozorňujeme, že v našem předchozím příkladu příkazu jsem nezadal sudo
heslo pro cílového uživatele. Proč? Protože, echo
příkaz nevyžaduje sudo
Heslo.
Pokud spustíte příkaz, který vyžaduje sudo
oprávnění jako jiný uživatel, musíte zadat heslo. Zde je další příklad.
$ sudo -u kumar bash -c 'sudo dnf --refresh update'
Ukázkový výstup:
[sudo] password for senthil: [sudo] password for kumar: AlmaLinux 8 - BaseOS 344 B/s | 4.3 kB 00:12 AlmaLinux 8 - AppStream 388 B/s | 4.7 kB 00:12 AlmaLinux 8 - Extras 316 B/s | 3.9 kB 00:12 Dependencies resolved. Nothing to do. Complete!
Všimli jste si, že jsem zadal sudo
heslo pro oba uživatele? Ano. Protože spouštíme "sudo dnf update
", který vyžaduje zvýšená oprávnění. Proto je nutné zadat sudo
heslo pro cílového uživatele. Pro běžné příkazy např. ls
, uname
atd., nemusíme zadávat heslo cílového uživatele.
Nejen příkazy Linuxu, tuto metodu můžete použít také pro spouštění skriptů. Řekněme, že chcete spustit zálohovací skript, který je uložen v $HOME
adresář jiného uživatele. Skript můžete jednoduše spustit od aktuálního uživatele jako jiného uživatele pomocí tohoto příkazu:
$ sudo -u kumar bash -c '~/backup_script_name'
Spouštět příkazy bez hesla sudo
Někdy se můžete dostat do situace, kdy nebudete chtít zadávat sudo heslo pro každý příkaz. V takových případech můžete přeskočit výzvu k zadání hesla pro konkrétní příkazy přidáním NOPASSWD
možnost v /etc/sudoers
soubor.
Řekněme, že chcete určitým uživatelům povolit spouštění jakéhokoli dnf příkaz bez sudo hesla. Chcete-li tak učinit, nejprve najděte cestu k dnf
pomocí příkazu which
nebo whereis
příkazy.
$ which dnf /usr/bin/dnf
$ whereis dnf dnf: /usr/bin/dnf /etc/dnf /usr/share/man/man8/dnf.8.gz
Jak můžete vidět, cesta ke spustitelnému souboru dnf
příkaz je /usr/bin/dnf
.
Nyní upravte /etc/sudoers
soubory pomocí příkazu:
$ sudo visudo
Pozor: Vezměte prosím na vědomí, že byste neměli ručně upravovat sudoers
soubor pomocí libovolného textového editoru. Vždy používejte visudo
příkaz k bezpečné úpravě sudoers
soubor.
Přidejte následující řádek na konec souboru, aby uživatel s názvem "kumar" mohl spouštět dnf
příkazy bez hesla sudo.
kumar ALL=NOPASSWD:/usr/bin/dnf
Uložte soubor a ukončete.
Od této chvíle může uživatel „kumar“ spouštět dnf
příkazy bez sudo
heslo.
[[email protected] ~]$ sudo -u kumar bash -c 'sudo dnf --refresh update' [sudo] password for senthil: AlmaLinux 8 - BaseOS 358 B/s | 4.3 kB 00:12 AlmaLinux 8 - AppStream 324 B/s | 4.7 kB 00:14 AlmaLinux 8 - Extras 302 B/s | 3.9 kB 00:13 Dependencies resolved. Nothing to do. Complete!
Vidět? Nemusíme zadávat sudo
heslo pro "kumar".
Chcete-li toto chování zrušit, jednoduše odstraňte výše uvedený řádek.
Odmítnutí odpovědnosti: Při aplikaci této metody byste měli být velmi opatrní. Tato metoda může být použita pro produktivní i destruktivní účely. Řekněme například, pokud uživatelům povolíte spouštět 'rm'
příkaz bez sudo
heslo, mohli by omylem nebo záměrně smazat důležité soubory. Nedělejte to, pokud to není opravdu nutné.
Závěr
V tomto krátkém tutoriálu jsme diskutovali o tom, jak umožnit uživatelům spouštět příkazy jako jiný uživatel pomocí sudo v Linuxu. Také jsme se naučili, jak zakázat výzvu k zadání hesla sudo pro určité uživatele při spouštění konkrétních příkazů úpravou sudoers
soubor.
Jak jsem varoval, musíte být opatrní při testování této metody na produkčním systému. Můžete nevědomky dovolit uživateli spustit škodlivý příkaz (např. rm
), aniž byste museli zadávat sudo heslo. Při testování těchto tipů pro Linux byste měli být vždy opatrní.
Související čtení:
- Provádění příkazů na vzdálených systémech Linux prostřednictvím SSH
- Jak spouštět konkrétní příkazy bez hesla Sudo v systému Linux