Piszę skrypt, który wymaga uprawnień na poziomie administratora, i chcę go wykonać, aby jeśli skrypt nie był uruchamiany jako root, po prostu powtarza „Uruchom jako root”. i wychodzi.
Oto pseudokod tego, czego szukam:
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
Jak mogę najlepiej (czysto i bezpiecznie) to osiągnąć? Dzięki!
Ach, dla wyjaśnienia: część (zrób rzeczy) wymagałaby wykonywania poleceń, które same w sobie wymagają rootowania. Tak więc uruchomienie go jako zwykłego użytkownika spowoduje błąd. Ma to na celu wyłącznie uruchomienie skryptu, który wymaga poleceń roota, bez używania sudo wewnątrz skryptu, szukam tylko cukru syntaktycznego.
id -u
zwraca0
root.Odpowiedzi:
Zmienna środowiskowa $ EUID przechowuje identyfikator UID bieżącego użytkownika. Identyfikator UID roota to 0. Użyj w skrypcie czegoś takiego:
Uwaga: jeśli dostaniesz,
2: [: Illegal number:
sprawdź, czy masz#!/bin/sh
na górze i zmień na#!/bin/bash
.źródło
2: [: Illegal number:
ostrzeżenie, dopóki nie zmieniłem go na wersję Sergio.then
jest w tej samej linii co warunek ...W skrypcie bash istnieje kilka sposobów sprawdzenia, czy działający użytkownik jest rootem.
Jako ostrzeżenie , nie sprawdzaj, czy użytkownik jest rootem, używając
root
nazwy użytkownika. Nic nie gwarantuje, że użytkownik o identyfikatorze 0 zostanie wywołanyroot
. Jest to bardzo silna konwencja, która jest szeroko stosowana, ale każdy może zmienić nazwę administratora na inną nazwę.Myślę, że najlepszym sposobem korzystania z bash jest użycie
$EUID
strony man:Jest to lepszy sposób niż ten,
$UID
który można zmienić i nie odzwierciedla rzeczywistego użytkownika uruchamiającego skrypt.Podchodzę do tego rodzaju problemu przez wstrzykiwanie
sudo
moich poleceń, gdy nie są uruchamiane jako root. Oto przykład:W ten sposób moje polecenie jest uruchamiane przez użytkownika root podczas korzystania z administratora lub przez
sudo
zwykłego użytkownika.Jeśli twój skrypt ma być zawsze uruchamiany przez root, po prostu ustaw odpowiednio uprawnienia (
0500
).źródło
printf $EUID
sudo lub bez niego, odzyskuję własny identyfikator UID. Jeśli użyjęid -u
, dostaję swój identyfikator UID, a gdy wywołuję go za pomocą sudo, otrzymuję 0. Czy zrobiłem coś złego?sudo bash <<<'echo $EUID'
zbash <<<'echo $EUID'
. Więcej informacji na temat hestrocopodobnego herestringu na tldp.org/LDP/abs/html/x17837.htmlPodano kilka odpowiedzi, ale wydaje się, że najlepszą metodą jest użycie:
id -u
Wydaje się to być bardziej niezawodne niż inne metody i wydaje się, że zwraca identyfikator 0, nawet jeśli skrypt zostanie uruchomiony
sudo
.źródło
lub
:)
źródło
sudo
, mogę po prostu pisaćsudo !!
i to działa dla mnie, zamiast naciskać strzałkę W GÓRĘ, przechodzić na początek wiersza i dodawaćsudo
ręcznie. Nie jestem pewien, czy to jest PODSTAWA, czy SUDO, czy coś innego, ale działa to przez cały czas.if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi
. Twoje zdrowie.Jak wspomniano w jego komentarzach @wrikken,
id -u
jest znacznie lepszym sprawdzeniem roota.Ponadto przy właściwym użyciu
sudo
możesz sprawdzić skrypt i sprawdzić, czy działa on jako root. Jeśli nie, poproś o ponowne wywołanie,sudo
a następnie uruchom z uprawnieniami administratora.W zależności od tego, co robi skrypt, inną opcją może być ustawienie
sudo
pozycji dla wszelkich specjalistycznych poleceń, których skrypt może potrzebować.źródło
$0
ma nazwę działającego skryptu. Oto kilka przykładów , które mogą ci pomóc.Istnieje proste sprawdzenie, czy użytkownik jest rootem.
[[ stuff ]]
Składnia jest standardowym sposobem prowadzenia sprawdzić w bash.Zakłada się również, że chcesz wyjść z 1, jeśli ci się nie powiedzie. Ta
error
funkcja ma pewien talent, który ustawia tekst wyjściowy na czerwony (niepotrzebny, ale dość elegancki, jeśli mnie zapytasz).źródło
error
polecenie? Mój system chyba tego nie ma. . .less
lub tym podobne); i (4) ustaw kolor tła, dzięki czemu tekst będzie czytelny niezależnie od koloru tła terminala użytkownika. Coś w stylufunction error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }
. (Dostosuj zgodnie z życzeniem.)Bardzo prosty sposób po prostu:
Zaletą korzystania z tego zamiast
id
jest to, że możesz sprawdzić, czy pewien użytkownik inny niż root również uruchamia polecenie; na przykład.źródło
whoami
zamiast używaniaid
;whoami
komenda może być również używany do sprawdzenia innych użytkowników niż root, po imieniu.0- Przeczytaj oficjalną dokumentację GNU Linux, istnieje wiele sposobów, aby zrobić to poprawnie.
1- upewnij się, że umieściłeś podpis powłoki, aby uniknąć błędów w interpretacji:
2 - to jest mój skrypt
źródło
W tej odpowiedzi, niech będzie jasne, zakładam, że czytelnik jest w stanie czytać,
bash
a skrypty powłoki POSIX- a takiedash
.Uważam, że nie ma tu wiele do wyjaśnienia, ponieważ wysoko głosowane odpowiedzi dobrze tłumaczą wiele z nich.
Jeśli jednak jest coś, co można wyjaśnić dalej, nie wahaj się komentować, zrobię co w mojej mocy, aby wypełnić luki.
Zoptymalizowane kompleksowe (nie tylko
) rozwiązanie zapewniające wydajność i niezawodność; kompatybilne z wszystkimi powłokamibash
Nowe rozwiązanie:
Benchmark (zapisz do pliku
is_user_root__benchmark
)Oryginalne rozwiązanie:
^^^ Udowodniono, że przekreślone rozwiązanie nie przyspiesza, ale działa już od dłuższego czasu, więc zamierzam go tu trzymać tak długo, jak będzie to konieczne.
Wyjaśnienie
Ponieważ odczytanie zmiennej
$EUID
standardowejbash
, efektywnego numeru identyfikatora użytkownika jest wiele razy szybsze niż wykonanieid -u
polecenia POSIX -lyby znaleźć identyfikator użytkownika, to rozwiązanie łączy obie funkcje w ładnie zapakowaną funkcję. Jeśli i tylko wtedy, gdy$EUID
z jakiegokolwiek powodu nie jest dostępny,id -u
polecenie zostanie wykonane, zapewniając, że otrzymamy odpowiednią wartość zwracaną bez względu na okoliczności .Dlaczego publikuję to rozwiązanie po tylu latach, o które pytał OP
Cóż, jeśli dobrze widzę, powyżej brakuje fragmentu kodu.
Widzisz, istnieje wiele zmiennych, które należy wziąć pod uwagę, a jedną z nich jest połączenie wydajności i niezawodności .
Przenośne rozwiązanie POSIX + Przykład użycia powyższej funkcji
Wniosek
O ile ci się to nie podoba, środowisko Unix / Linux jest bardzo zróżnicowane. Oznacza to, że są ludzie, którzy
bash
tak bardzo lubią , nawet nie myślą o przenośności ( powłoki POSIX ). Inni, tacy jak ja, wolą powłoki POSIX . Obecnie jest to kwestia osobistego wyboru i potrzeb.źródło
Jeśli skrypt naprawdę wymaga dostępu do konta root, jego uprawnienia do plików powinny to odzwierciedlać. Posiadanie skryptu root wykonywalnego przez użytkowników innych niż root byłoby czerwoną flagą. Zachęcam do nie kontrolowania dostępu
if
czekiem.źródło
777
bomby powoduje, że ta kontrola jest trochę wadliwa dla użytkowników, którzy popełniliby błąd.bash /path/to/script
, nadal można go uruchomićo=r
Jednym prostym sposobem, aby skrypt mógł być uruchamiany tylko przez root, jest uruchomienie skryptu za pomocą wiersza:
#!/bin/su root
źródło
exit
? Nadal te odpowiedzi są oceniane? Myślę, że ludzie domyślnie nie chcą, aby skrypt był uruchamiany jako root. Więc podążam za tym sposobem myślenia, z prostszą odpowiedzią. Ale tak, możesz także uczyć się z pełniejszych odpowiedzi powyżejspróbuj następującego kodu:
LUB
źródło
O ile wiem, poprawnym sposobem sprawdzenia jest:
Zobacz sekcję „Testowanie rootowania” tutaj:
http://linuxcommand.org/lc3_wss0080.php
źródło
= "0"
z-eq 0
id -u
jest znacznie lepszy niżwhoami
, ponieważ niektóre systemy, takie jak Android, mogą nie zapewniać słowa root.Przykład:
źródło
Uwaga edytora: Jeśli nie potrzebujesz podwójnych nawiasów, użyj pojedynczych nawiasów do przenoszenia kodu.
źródło
Sprawdź, czy jesteś rootem i wyjdź, jeśli nie jesteś:
Lub w tym przykładzie spróbuj utworzyć katalog w lokalizacji głównej, a następnie spróbuj po podniesieniu uprawnień.
Sprawdź, czy jesteś rootem, a jeśli nie, to jeśli to możliwe:
źródło
Sprawdź root:
Testowane i działające w katalogu głównym.
źródło