Velmi záleží na tom, jak svůj program nazýváte sudo
nebo su
.
Např. na systému, na kterém se v tuto chvíli nacházím:
.bashrc
COMMAND $HOME $USER Env. $PATH
1. sudo -i (root) root root [1]
2. sudo -s (USER) root USER /home/${USER}/bin:[1]
3. sudo /bin/bash (USER) root USER /home/${USER}/bin:[1]
4. sudo su (root) root USER [1]:/usr/games:/usr/local/games
5. sudo su - (root) root root [1]
Kde [1]=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Env=Proměnné prostředí jsou resetovány pro 1 a 5, převzaty z $USER v 2,3,4.
Takže skript nebo program, který je spuštěn s jinou možností, může vidět různé $PATH
, $HOME
, jeho shell může číst různé .bashrc
,.profile
a Proměnné prostředí. Přečte soubor související s $HOME
. Každý uživatel může upravit své prostředí jiným způsobem (proměnné, $PATH
, .bashrc, .profile, .bash_profile, alias...). Uživatel může mít zejména jiné pořadí adresářů ve svém $PATH
a v důsledku toho může skript provést příkaz, např. v /home/$USER/bin
místo toho pak ten v cestě očekávaný od roota.
Program můžete spustit pod sudo -i
jak jste byli přihlášeni jako root s su -
,ale můžete mít jiné chování, pokud jej spustíte s sudo MyCommand
nebo pomocí su -c MyCommand
.
Od man su
:
V části popisu:
Aktuální prostředí je předáno novému prostředí . Hodnota $PATH je resetována do /bin:/usr/bin pro normální uživatele nebo/sbin:/bin:/usr/sbin:/usr/bin pro superuživatele
...
V části možností:
- , -l, --přihlášení
Poskytněte prostředí podobné co by uživatel očekával, kdyby se uživatel přihlásil přímo .
Od muže sudo
-i , --přihlásit se
Spusťte shell určený záznamem databáze hesel cílového uživatele jako přihlašovací shell. To znamená, že soubory prostředků specifické pro přihlášení, jako jsou .profile nebo .login, budou čteny shellem. Pokud je zadán příkaz, je předán do shellu k provedení přes volbu -c prostředí. Pokud není zadán žádný příkaz, spustí se interaktivní shell.sudo
se před spuštěním shellu pokusí změnit domovský adresář daného uživatele. Příkaz se spouští v prostředí podobném tomu, které by uživatel obdržel při přihlášení . Část Příkazové prostředí v manuálu sudoers(5) dokumentuje, jak volba -i ovlivňuje prostředí, ve kterém je příkaz spuštěn, když se používá politika sudoers.
Pokud máte plný sudo
přístup, můžete se stát root
pomocí sudo su -
, takže bezpečnostní bod je diskutabilní.
Ve skutečnosti existuje způsob, jak rozpoznat rozdíl mezi programem spuštěným jako root
a program běžel pod sudo
- pomocí getuid
vs geteuid
- ale to je vykonstruovaný trik. Proč by to systém oprav dělal?
Existuje několik rozdílů, pokud získáváte root shell, jak poukázal @Hastur.
Pokud nezískáváte kořenový shell, pak existuje více rozdílů. Člen podpory může mít zkušenosti s pokusy o věci jako sudo patch -p0 < /root/patch.file
kde patch
je spuštěn jako root, ale <
(napojení ze souboru) není.