Jak jste poznamenali, cd
je vestavěný příkaz shellu a má k tomu důvod za to:"aktuální adresář" je parametr pro každý proces, který může změnit pouze proces sám .
Pracovní adresář vašeho shellu nemůže změnit žádný podřízený proces – takže i když se vám podaří spustit cd
v privilegovaném subshell změní pouze pracovní adresář tohoto dočasného subshell a nezáleží na tom, jakou metodu zvýšení oprávnění použijete.
Tedy pro sudo cd
Aby sudo fungovalo, muselo by být vestavěný shell a potřebovalo by nějaký způsob, jak zvýšit oprávnění již běžícímu procesu. V současné době žádný takový mechanismus v Linuxu (ani ve většině ostatních operačních systémů) neexistuje.
Jedním ze způsobů, jak dosáhnout toho, co chcete, je spustit interaktivní shell s právy root (funguje jakákoli metoda) a stačí použít běžný cd
v něm:
[[email protected] /]$ sudo bash
[[email protected] /]# cd /root/secret
Pokud to chcete udělat v jednom příkazu, muselo by to vypadat takto – nejprve změňte pracovní adresář a poté spusťte interaktivní shell:
sudo bash -c "cd /root/secret && bash"
su -c "cd /root/secret && zsh"
Poznámka:Vnější příkaz nemusí být shell, musí to být jen něco který změní svůj pracovní adresář a provede nový příkaz. Nejnovější systémy Linux mají jednoho nebo dva pomocníky, které lze použít:
sudo nsenter --wd="/root/secret" bash # util-linux v2.23 (debian jessie)
sudo env --chdir="/root/secret" bash # coreutils v8.28 (debian buster)
Výhodou této metody je, že nevyžaduje vnořené citace; můžete spustit víceslovný příkaz, aniž byste měli problémy s mezerami nebo speciálními znaky.
A konečně, některé programy mají vestavěnou možnost změnit svůj pracovní adresář:
sudo make -C /etc
sudo git -C /root/secret log
Druhá odpověď není špatná.
Možná lepší odpověď je:
Nástroj sudo je určen k provádění akcí jako superuživatel a vy popisujete něco, co je spíše změnou stavu, která by předcházela akcím jako 'ls' nebo 'vi' nebo jiným, aby byly jednodušší.
Navrhuji např. pokud jste chtěli upravit soubor v /root/private/:
sudo ls /root
sudo ls /root/private
sudoedit /root/private/<name from previous ls command>
To je rozhodně více psaní a trochu těžší než jen změna adresářů. Je to však daleko schopnější auditu a mnohem více v souladu s principy sudo než spouštění nějaké varianty „sudo bash“.
Pokud pracujete v bezpečném prostředí, váš tým IA vám poděkuje. Pokud se přistihnete, že si říkáte:„Jakou změnu jsem včera udělal?“, pak vy vám poděkuje, protože se nebudete muset divit, jaký soubor nebo soubory jste upravili.
To vše znamená, že povolení a provádění nějaké formy „sudo bash“ je rozhodně jednodušší. Pokud jste hledali jednodušší, proč na prvním místě používáte 'sudo' namísto pouhého přihlášení jako root?