Skrypty Bash: Wymagaj, aby skrypt był uruchamiany jako root (lub z sudo)


26

Próbuję napisać skrypt bash (w Ubuntu), który utworzy kopię zapasową katalogu przy użyciu tar.

Jak mogę sprawdzić skrypt w skrypcie, aby można go było uruchamiać tylko jako root (lub z sudo)?

Na przykład, jeśli użytkownik uruchomi skrypt, powinien powiedzieć, że ten skrypt musi być uruchomiony z uprawnieniami sudo, a następnie wyjść. Jeśli skrypt zostanie wykonany jako root, będzie kontynuował sprawdzanie.

Wiem, że musi istnieć łatwe rozwiązanie, po prostu nie byłem w stanie go znaleźć, przeglądając google.

Odpowiedzi:


37

Aby pobrać efektywny identyfikator użytkownika, użyj tego polecenia:

id -u

Jeśli wynikiem jest „0”, skrypt działa jako root lub używa sudo. Możesz uruchomić sprawdzanie, wykonując coś takiego:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

5
Poleciłbym pełną kwalifikację ścieżki do id (np. / Usr / bin / id). W przeciwnym razie przebiegły użytkownik mógłby napisać własny skrypt / plik binarny, który zawsze zwraca 0, a następnie umieścić go w miejscu, które istnieje wcześniej na ścieżce wykonujących użytkowników.
ktower

Zgoda. Naprawianie za pomocą edycji.
Scott Pack

6
Każdy „przebiegły”, próbujący uruchomić skrypt, nie zostanie przez ciebie zatrzymany przy użyciu pełnej ścieżki do identyfikatora.
theotherreceive

Zgadzam się z nimi ... to skrypt bashowy. Zakwalifikowanie bin „id” nie powstrzyma nikogo, kto i tak jest poważnie zainteresowany obejściem czeku. Lepiej pozostawić to bez zastrzeżeń ze względu na przenośność.
Chris

1
Nie dotyczy to wymogu „sudo”.
GregB

17

Zakładam, że wiesz o tym, zmieniając własność na root

chown root:root file

i ustawienie uprawnień na 700

chmod 700 file

osiągniesz to samo - bez sugestii, aby uruchomić jako sudo.

Ale opublikuję tę odpowiedź dla kompletności.


3
Jest to bardziej odpowiednie rozwiązanie niż zaakceptowana odpowiedź. - Moje 0,02 USD
Chris

Uwaga dodatkowa: sprawdzenie skryptu w git staje się trudniejsze. Aby naprawić,sudo git add <file>
Chaim Eliyah

2

Jaki jest twój cel, aby poinformować użytkownika, że ​​powinien uruchomić skrypt jako root lub jako środek bezpieczeństwa?

Jeśli chcesz tylko poinformować użytkownika, że ​​jakakolwiek sugestia UID jest w porządku, ale są one tak samo użyteczne jak opony na koniu jak środek bezpieczeństwa - nic nie powstrzyma użytkownika przed skopiowaniem skryptu, wyjęciem instrukcji if, i tak czy inaczej.

Jeśli jest to kwestia bezpieczeństwa, skrypt powinien być ustawiony na 700, będący własnością root: root, aby nie był czytelny ani wykonywalny przez żadnego innego użytkownika.


Lub może to być skrypt wymaga dostępu do plików lub poleceń dostępnych tylko dla użytkownika root w celu wykonania swojej pracy, jak w moim przypadku
chrisbunney

2

Możesz także użyć komendy whoami.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

W rzeczywistości uid 0 to specjalne konto użytkownika z pełnymi uprawnieniami. „root” to po prostu najczęstsza etykieta / nazwa przypisana do tego identyfikatora UID. Nie musi to być „root”, a atakujący może spróbować to wykorzystać.
0xSheepdog

2

Zmienna bash $EUIDpokazuje efektywny UID, na którym działa skrypt, jeśli chcesz się upewnić, że skrypt działa jako root, sprawdź, czy $EUIDzawiera wartość 0, czy nie:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

Jest to lepsze niż rozwiązanie z /usr/bin/id(dla skryptów bash!), Ponieważ nie wymaga zewnętrznego polecenia.


1
Zamiast po prostu wychodzić, może poprosić użytkownika o zalogowanie się w sudo, zastępując echolinię sudo "$0" "$@"i, zastępując exit 2exit $?.
schumacher574

Dobry pomysł. Jednak pytanie dotyczyło skryptu, który zakończyłby się, a nie sam sudo.
neuhaus

0

Jednym prostym sposobem, aby skrypt mógł być uruchamiany tylko przez root, jest uruchomienie skryptu za pomocą wiersza:
#!/bin/su root


-1

„#! / bin / su root” pozwala użytkownikom w trybie superużytkownika na uruchomienie skryptu bez użycia hasła roota. Jeśli chcesz, aby superużytkownicy uruchomili skrypt z wynikami roota, zrobi to.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.