Piszę prosty skrypt bash, ale potrzebuję go, aby sprawdzić, czy jest uruchamiany jako root, czy nie. Wiem, że jest to prawdopodobnie bardzo prosty sposób, ale nie mam pojęcia, jak to zrobić.
Żeby było jasne:
Co to jest prosty sposób, aby napisać skrypt foo.sh , tak że polecenie ./foo.sh
wyjścia 0
i polecenie sudo ./foo.sh
wyjścia 1
?
$UID
i$EUID
są bashizmami. Powłoki zgodne tylko z POSIX nie mają tych zmiennych i należy ich użyćid(1)
.if ((EUID)); then
, patrz komentarz @ geirhasudo
. Jeśli uruchomiszsudo sh -c 'echo $EUID'
, zobaczysz oczekiwane wyniki.$EUID
jest Baszizmem (jak wspomniano powyżej przez @DavidFoerster), a twój/bin/sh
link najprawdopodobniej/bin/dash
nie/bin/bash
.sudo bash -c 'echo $EUID'
przyniesie oczekiwany wynik.Użytkownik root nie musi mieć nazwy „root”.
whoami
zwraca pierwszą nazwę użytkownika z identyfikatorem użytkownika0
.$USER
zawiera nazwę zalogowanego użytkownika, który może mieć identyfikator użytkownika0
, ale może mieć inną nazwę.Jedyny niezawodny program sprawdzający, czy konto jest zalogowane jako root, czy nie:
Używam
-u
do efektywnego identyfikatora użytkownika, a nie-r
na prawdziwym identyfikatorem użytkownika. Uprawnienia są określane przez efektywny identyfikator użytkownika, a nie rzeczywisty .Testy
/etc/passwd
zawiera następujące nazwy użytkowników o identyfikatorze użytkownika0
w podanej kolejności:Zalogowany jako
root2
daje kolejne wyniki:whoami
:rootx
echo $USER
:root2
(zwraca pusty ciąg, jeśli program został uruchomiony w pustym środowisku, np.env -i sh -c 'echo $USER'
)id -u
:0
Jak widać, inne programy zakończyły się niepowodzeniem w tej kontroli, tylkoid -u
przeszły.Zaktualizowany skrypt wygląda następująco:
źródło
id -u
w bash askubuntu.com/questions/30148/…sh
(dash
) jako interpretera zamiastbash
. Ale dobry strzał, oszczędza kolejny widelec :)[ -w / ]
. Pomysł pozostaje ten sam. Uwaga: w niektórych chrootach[ -w /etc/shadow ]
zawiedzie, ponieważ/etc/shadow
nie istnieje, dlatego/
preferowane jest podejście z . O wiele lepiej byłoby sprawdzić faktyczną potrzebę uprawnień roota. Jeśli skrypt wymaga zapisu/etc/someconfig
, po prostu sprawdź, czy ten plik jest zapisywalny LUB plik nie istnieje i/etc
można go zapisać.Jak powiedział @Lekensteyn , powinieneś użyć skutecznego identyfikatora użytkownika. Nie musisz dzwonić
id -u
bash:Sugestia @ geirha z komentarzy wykorzystuje ocenę arytmetyczną:
źródło
((..))
do testowania liczb oraz[[..]]
do testowania ciągów i plików, więc zrobiłbymif (( EUID != 0 )); then
zamiast tego, lub po prostuif ((EUID)); then
EUID
powinien zostać$EUID
. Zamiast używać(( $EUID != 0 ))
, użyj[ $EUID != 0 ]
. To też będzie działaćdash
.EUID
działa dobrze. Pytanie jest oznaczonybash
niedash
. Polecenieenv -i sh -c '[ $EUID != 0 ]'
kończy się niepowodzeniem, aleenv -i bash -c '(( EUID != 0 ))'
działa. btw,dash
nie działa dla niektórych nie-ascii znaków na Ubuntu stackoverflow.com/questions/5160125/... Jest rok 2011 i są ludzie, którzy używają innych języków.$EUID
materiałach od tego momentu. W rezultacie zmieniłem zaakceptowaną odpowiedź.Możesz to zrobić za pomocą
whoami
polecenia, które zwraca bieżącego użytkownika:Uruchomienie powyższego spowoduje wydrukowanie,
You must be root to do this.
jeśli bieżący użytkownik nie jestroot
.Uwaga: w niektórych przypadkach alternatywą jest po prostu sprawdzenie
$USER
zmiennej:źródło
$USER
, szczególnie w ten sposób.$USER
jest ustawiany przez powłokę logowania, nie trzeba go propagować do programu (env -i sh -c 'echo $USER'
). W ten sposób$USER
jest pusty i występuje błąd składniowy.$USER
ustawiony przez powłokę, ale jest także czymś, co jest łatwe do sfałszowania. Whoami zwróci faktycznego użytkownika.$USER
jest interpretowany przez twoją powłokę, twój przykład powinien byćsudo sh -c 'echo $USER'
, aby był znaczący. @George: błędne założenie, żewhoami
zawsze wróciroot
do UID 0.Biorąc pod uwagę wydajność, możesz najpierw przetestować
EUID
zmienną środowiskową, a następnie, jeśli nie istnieje, wywołać standardoweid
polecenie:W ten sposób, ze względu na skrót LUB , unikasz wywoływania polecenia systemowego, priorytetem zapytania dotyczącego zmiennej w pamięci.
Ponowne użycie kodu:
źródło
id -u
. Zobacz skryptźródło
Jednym prostym sposobem, aby skrypt mógł być uruchamiany tylko przez root, jest uruchomienie skryptu za pomocą wiersza:
#!/bin/su root
źródło
źródło
Ten fragment kodu:
sudo !!
źródło
Ta odpowiedź ma na celu zapisanie pomysłu, który może być pomocny dla niektórych z was. Jeśli potrzebujesz skryptu, który jest uruchamiany z graficznego interfejsu użytkownika i wymaga uprawnień administratora, wypróbuj ten sposób:
W ten sposób otrzymasz ładne okno dialogowe z pytaniem o hasło użytkownika root. Podobnie jak w sudo z linii poleceń.
gksudo
Mogą nie być dostępne w systemie, a następnie zainstalować gosudo apt-get install gksu
.źródło
Ten kod działa zarówno pod Bash, jak i giełdowym Bourne sh (testowanym pod FreeBSD), który nie definiuje EUID. Jeśli istnieje identyfikator EUID, zwracana jest jego wartość, w przeciwnym razie uruchamiane jest polecenie „id”. Jest odrobinę krótszy niż w powyższym przykładzie „lub”, ponieważ wykorzystuje wbudowaną powłokę „: -”.
Zrootuj w sh:
źródło