Jaký je rozdíl mezi následujícími příkazy:
su
Sudo -s
Sudo -i
Sudo bash
Vím pro su
Potřebuji znát heslo root a pro Sudo
musím být v souboru sudoers
, ale jakmile se jednou spustí, jaký je rozdíl?
Vím, že je rozdíl mezi su
a Sudo -s
protože můj domovský adresář je /root
po provedení su
, ale můj domovský adresář je stále /home/myname
po Sudo -s
. Ale mám podezření, že je to jen příznak základního rozdílu, který mi chybí.
S su
budete stát se další uživatel - ve výchozím nastavení root, ale potenciálně jiný uživatel. Pokud řeknete su -
, vaše prostředí bude nahrazeno také prostředím pro přihlášení daného uživatele, takže to, co vidíte, je nerozeznatelné od přihlášení jako tento uživatel. Neexistuje způsob, jak by systém mohl sdělit, co děláte, zatímco su
'd jinému uživateli z akcí tohoto uživatele, když se přihlásí.
Věci se u Sudo
velmi liší:
Příkazy, kterými procházíte Sudo
vykonat jako cílový uživatel - ve výchozím nastavení root, ale s -u
- ale zaznamenává příkazy, které skrz něj procházíte, označí je vaším uživatelským jménem, takže vinu lze později přiřadit. :)
Sudo
je velmi flexibilní. Můžete omezit příkazy, které může daný uživatel nebo skupina uživatelů například spouštět. S su
je to všechno nebo nic.
Tato funkce se obvykle používá k definování rolí. Můžete například definovat skupinu „záloh“ povolenou ke spuštění dump
a tar
, z nichž každá potřebuje přístup root, aby správně zálohovala systémový disk.
Zmíním se o tom zde, protože to znamená, že můžete někomu dát Sudo
oprávnění, aniž byste jim udělili Sudo -s
nebo Sudo bash
schopnosti. Mají pouze oprávnění potřebná k provedení své práce, zatímco s su
mají spuštěn celý systém. Musíte s tím však dávat pozor: pokud někomu dáte schopnost říct Sudo vi
, například mohou Shell z vi
a mají účinně stejnou sílu jako s Sudo -s
.
Protože namísto kořenového hesla bere heslo sudoeru, izoluje Sudo
oprávnění mezi více sudoery.
Tím se vyřeší administrativní problém s su
, což znamená, že když se změní heslo root, museli být informováni všichni, kdo to museli vědět su
. Sudo
umožňuje nezávisle měnit hesla sudoerů. Ve skutečnosti je běžné, že uživatel root root účtu v systému pomocí hesla Sudo
vynutí všechny úkoly sysadmin, které mají být provedeny pomocí Sudo
. Ve velké organizaci s mnoha důvěryhodnými sudoery to znamená, že když jeden ze sysadminů odejde, nemusíte měnit kořenové heslo a distribuovat je těm administrátorům, kteří zůstanou.
Hlavní rozdíl mezi Sudo bash
a Sudo -s
je to -s
je kratší a umožňuje předávat příkazy k provedení ve výchozím prostředí vašeho uživatele několika způsoby:
Můžeš říct Sudo -s some-command
které běží some-command
pod vaší Shell. Je to v podstatě zkratka pro Sudo $Shell -c some-command
.
Místo toho můžete tyto příkazy předat standardnímu vstupu Shell, například Sudo -s < my-Shell-script
. Můžete to použít s heredoc k odeslání několika příkazů na jedno volání Sudo
, abyste se vyhnuli nutnosti opakovaně psát Sudo
.
Obě tyto chování jsou volitelné. Mnohem častěji dáváte -s
samotné, takže interaktivně spustí prostředí uživatele. V tomto režimu se liší od Sudo bash
v tom, že by to mohlo spouštět jiné prostředí než bash
, protože to vypadá nejprve v proměnné prostředí Shell
, a pak, pokud to není nastaveno, na nastavení uživatelského prostředí Shell, obvykle v /etc/passwd
.
Shell provozuje Sudo -s
zdědí vaše současné uživatelské prostředí. Pokud to, co skutečně chcete, je čisté prostředí, jako byste se dostali hned po přihlášení, je místo toho Sudo -i
, relativně nedávný přírůstek do Sudo
. Zhruba řečeno, Sudo -i
je Sudo -s
tak jako su -
je su
: resetuje všechny proměnné prostředí kromě několika a pošle vás zpět do domovského adresáře uživatele. Pokud mu také nedáte příkazy ke spuštění pod tímto Shell prostřednictvím standardního vstupu nebo Sudo -i some-command
, spustí Shell jako interaktivní přihlašovací prostředí, takže spouštěcí skripty vašeho uživatele Shell (např. .bash_profile
) znovu spusťte.
To vše dělá Sudo -i
podstatně bezpečnější než Sudo -s
. Proč? Protože pokud někdo může upravit vaše prostředí před Sudo -s
, mohly by způsobit nechtěné příkazy. Nejviditelnějším případem je změna Shell
, ale může se také stát méně přímo, například prostřednictvím PAGER
, pokud řeknete man foo
zatímco pod Sudo -s
.
Dalo by se říci: „Pokud mohou modifikovat PAGER
, mohou modifikovat PATH
, a pak mohou jednoduše nahradit zlý program Sudo
,“ ale někdo dostatečně paranoidní může říct /usr/bin/Sudo /bin/bash
aby se zabránilo této pasti. Pravděpodobně nejste tak paranoidní, že se také vyhnete pastím ve všech dalších vnímavých proměnných prostředí. Vzpomněli jste si také na kontrolu EDITOR
, například před spuštěním jakéhokoli příkazu VCS ? Tím pádem Sudo -i
.
Protože Sudo -i
také změní váš pracovní adresář na domovský adresář uživatele, možná budete chtít použít Sudo -s
pro situace, kdy víte, že chcete zůstat ve stejném adresáři, do kterého jste byli cd
'při spuštění Sudo
. Je stále bezpečnější Sudo -i
a cd
tam, kde jste byli.
Z příspěvku buntuforums Udělal jsem před chvílí:
Zvažte následující experiment:
[email protected]:~% Sudo su
[Sudo] password for applic:
[email protected]:/home/applic# env > /tmp/Sudo_su_env
[email protected]:/home/applic# exit
exit
[email protected]:~% Sudo -s
applic .bashrc read...
[email protected]:~% env >/tmp/Sudo_s
Zde jsou rozdíly, které jsem našel:
S Sudo -s
:
HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc
S Sudo su
:
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc
Všimněte si rozdílu v $HOME
. Být root a mít $HOME
nastaveno na běžný domov uživatele může způsobit problémy. Pokud například spustíte grafickou aplikaci, běžný uživatel ~/.Xauthority
může být přepsán rootem. To způsobí běžné problémy uživatele později, jako například nemožnost spouštět určité grafické aplikace prostřednictvím cronu.
Shrnout:
corrupted by user's
HOME=/root uses root's PATH env vars
Sudo -i Y Y[2] N
Sudo -s N Y[2] Y
Sudo bash N Y[2] Y
Sudo su Y N[1] Y
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
pravděpodobně nastaveno /etc/environment
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Dolní řádek je Sudo -i
je správný příkaz, který se má spustit, když chcete kořenové prostředí, které není ovládáno prostředím uživatele.
su
(s čarodějnice ser nebo s ubstitute ser) umožňuje přepínat uživatele. su
v podstatě zahajuje další instanci Shell s oprávněními zamýšleného uživatele. Ve výchozím nastavení vás přepne na uživatele root
, chceme-li přepnout na konkrétního uživatele, musíme uživatele předat následujícím způsobem:
$ su bob # switches to bob (requires bob's password)
su -
znamená, že proměnné prostředí budou obnoveny na root a su
znamená proměnné prostředí jako starý uživatel.
například: domovský adresář root, pokud používáte su -
nebo starý domovský adresář uživatele, pokud používáte su
.
Sudo (s uper ser do) je obslužný program příkazového řádku, který umožňuje uživatelům spouštět programy s bezpečnostními oprávněními jiného uživatele default je superuser, tj. root
. Používá konfigurační soubor /etc/sudoers
které uvádí, kteří uživatelé mají práva na konkrétní akce
Sudo by se mělo číst jako / ˈsuːduː /. syntaxe Sudo command
tj. s čarodějnice ser a do tento příkaz.
su
je ekvivalentní s Sudo -i
a simuluje přihlášení do kořenového účtu. Váš pracovní adresář bude /root
, a bude číst kořenové .profile
atd. Výzva se změní z $ na #, což znamená, že máte přístup root.
Sudo -s
spustí Shell jako root, ale nemění váš pracovní adresář.
Sudo bash
kde bash
je příkaz ke spuštění s Sudo
. Tento příkaz spustí bash
jako super uživatel.
Sudo
lze zaznamenávat vše, co někdo dělá.Sudo
zabraňuje uživateli znát root heslo.Sudo
můžeme omezit příkazy, které jsou povoleny ke spuštění.