GNU/Linux >> Znalost Linux >  >> Linux

Proč „sudo Su“ ve skriptu Shell nespustí zbytek skriptu jako kořen?

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 ||


Linux
  1. Proč nefunguje ~/.bash_profile?

  2. Jak zpětně zajistit, aby skript běžel jako root?

  3. Jak zajistit, aby skript Shell vždy běžel jako root?

  1. Odkud se spouští skript Shell?

  2. Význam $? Ve skriptu Shell?

  3. Proč potřebujete umístit #!/bin/bash na začátek souboru skriptu?

  1. Jak spustit příkaz jako správce systému (root)?

  2. Proč skript Bash nerozpozná aliasy?

  3. Spustit příkaz shell v jenkins jako uživatel root?