Polecenia w skrypcie są wykonywane pojedynczo, niezależnie. Sam skrypt jako rodzic wszystkich poleceń w skrypcie jest kolejnym niezależnym procesem, a polecenie su nie zmienia i nie może zmienić go na root: polecenie su tworzy nowy proces z uprawnieniami roota.
Po zakończeniu tej komendy su proces nadrzędny, nadal uruchomiony jako ten sam użytkownik, wykona resztę skryptu.
Co chcesz zrobić, to napisać skrypt opakowania. Uprzywilejowane polecenia przechodzą na przykład do skryptu głównego~/main.sh
#!/bin/sh
ls /root
Skrypt otoki wywołuje skrypt główny z uprawnieniami administratora, podobnie jak ten
#!/bin/sh
su -c ~/main.sh root
Aby uruchomić ten proces, uruchom opakowanie, które z kolei uruchamia główny skrypt po przełączeniu użytkownika na użytkownika root.
Tej techniki otoki można użyć do przekształcenia skryptu w otokę wokół siebie. Zasadniczo sprawdź, czy działa jako root, jeśli nie, użyj „su”, aby ponownie się uruchomić.
$ 0 to przydatny sposób na odniesienie się do skryptu, a komenda whoami może powiedzieć nam, kim jesteśmy (czy jesteśmy rootami?)
Tak więc główny skrypt z wbudowanym otokiem staje się
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Zwróć uwagę na użycie exec. Oznacza to „zamień ten program na”, co skutecznie kończy jego wykonywanie i uruchamia nowy program, uruchamiany przez su, z rootem, aby działał od góry. Instancja zastępująca to „root”, więc nie wykonuje prawej strony ||
sudo su
bolą mnie oczy.