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.

Cory Plastek
źródło

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
Scott Pack
źródło
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.

Brent
źródło
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.

inne
źródło
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
Kiril
źródło
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.

neuhaus
źródło
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

alexandre1985
źródło
-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.

Lynnux
źródło