Vzorový skript může vypadat následovně:
#!/bin/bash
sudo su
ls /root
Při použití ./test.sh
jako normální uživatel místo toho spusťte ls
jako super uživatel a ukončení se přepne na root; a když se odhlásím, spustí se ls /root
jako normální uživatel.
Může mi někdo říct o tom mechanismu?
Přijatá odpověď:
Příkazy ve skriptu se provádějí jeden po druhém nezávisle. Samotný skript jako rodič všech příkazů ve skriptu je dalším nezávislým procesem a příkaz su jej nemění a ani nemůže změnit na root:příkaz su vytvoří nový proces s právy root.
Po dokončení tohoto příkazu su provede nadřazený proces, který stále běží jako stejný uživatel, zbytek skriptu.
Co chcete udělat, je napsat obalový skript. Privilegované příkazy jdou do hlavního skriptu, například ~/main.sh
#!/bin/sh
ls /root
Skript wrapper volá hlavní skript s oprávněními root, jako je tento
#!/bin/sh
su -c ~/main.sh root
Ke spuštění tohoto procesu spustíte wrapper, který zase spustí hlavní skript po přepnutí uživatele na uživatele root.
Tuto techniku obalu lze použít k přeměně skriptu na obal kolem sebe. V podstatě zkontrolujte, zda běží jako root, pokud ne, použijte „su“ k opětovnému spuštění.
$0 je praktický způsob, jak přimět skript odkazovat sám na sebe, a příkaz whoami nám může říct, kdo jsme (jsme root?)
Hlavním skriptem s vestavěným obalem se tedy stává
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Všimněte si použití exec. Znamená to „nahradit tento program za“, což fakticky ukončí jeho provádění a spustí nový program spuštěný su s rootem, aby běžel shora. Instance nahrazení je „root“, takže neprovádí pravou stranu ||