Oto moje źródło:
#!/bin/bash
echo "Running script to free general cached memory!"
echo "";
echo "Script must be run as root!";
echo "";
echo "Clearing swap!";
swapoff -a && swapon -a;
echo "";
echo "Clear inodes and page file!";
echo 1 > /proc/sys/vm/drop_caches;
echo "";
Czyści pamięć podręczną i inne rzeczy, i przypomina, że musi być uruchomiony jako root w terminalu. Zasadniczo chcę, aby skrypt przestał działać, jeśli wykryje, że nie jest wykonywany jako root.
Przykład:
"Running script to free general cached memory!"
"Warning: script must be run as root or with elevated privileges!"
"Error: script not running as root or with sudo! Exiting..."
Jeśli działa z podwyższonymi uprawnieniami, działa po prostu normalnie. Jakieś pomysły? Dzięki!
shell-script
root
M. Knepper
źródło
źródło
root
przez prefiksowanie prefiksu wszystkich poleceń, które muszą być uruchomione tak jakroot
zsudo
.Odpowiedzi:
Użytkownik root ma identyfikator UID 0 (niezależnie od nazwy konta „root”). Jeśli efektywny identyfikator UID zwracany przez
id -u
nie jest równy zero, użytkownik nie wykonuje skryptu z uprawnieniami administratora. Służyid -ru
do testowania rzeczywistego identyfikatora (UID użytkownika wywołującego skrypt).Nie używaj
$EUID
w skrypcie, ponieważ może zostać zmodyfikowany przez nieuprzywilejowanego użytkownika:Jeśli użytkownik to zrobi, nie spowoduje to oczywiście eskalacji uprawnień, ale może spowodować, że polecenia w skrypcie nie będą mogły wykonać tego, co powinny, a pliki zostaną utworzone z niewłaściwym właścicielem itp.
źródło
/bin/id -u
/bin/id: illegal option -- u
Usage: id [-ap] [user]
/usr/xpg4/bin
wcześnie,$PATH
aby uzyskać dostęp do narzędzi POSIX w systemie Solaris.-u
opcjaid
nie jest uniwersalna, a zatem to rozwiązanie jest uniwersalne tylko z zastrzeżeniem, że wersja POSIXid
musi najpierw wystąpić w ŚCIEŻCE.$PATH
u góry skryptu, tak jak/usr/xpg4/bin
poprzednio/bin
. Jeśli nalegasz na używanie innych niż POSIXid
, oczywiście będziesz musiał wymyślić bardziej przenośne rozwiązanie.PATH=$( getconf PATH )
lub ustawić inną jawną domyślną ścieżkę lub użyć jawnej ścieżki do wywoływaniaid
.Myślę, że chcesz raczej sprawdzić, czy masz uprawnienia superużytkownika, czyli że Twój efektywny identyfikator użytkownika to 0.
zsh
ibash
udostępnij to w$EUID
zmiennej, abyś mógł:Z dowolnymi powłokami podobnymi do POSIX, możesz użyć
id
standardowego polecenia:Zauważ, że wszystkie
id -un
lubwhoami
lub$USERNAME
zmiennązsh
będzie Ci pierwszą nazwę użytkownika uid. W systemach, które mają innych użytkowników o identyfikatorze 0, może to nie byćroot
nawet jeśli proces jest potomkiem tego, który został uwierzytelniony jakoroot
.$USER
będzie zazwyczaj daje użytkownikowi, że uwierzytelnione, ale opierając się na nim jest dość kruche. Nie jest ustawiane przez powłokę, ale zwykle jest ustawiane przez polecenie uwierzytelniające (jaklogin
,su
(w systemach GNU / Linux, niekoniecznie inne)sudo
,sshd
((przynajmniej od openssh) ...). Nie zawsze jednak (zmiana identyfikatora użytkownika nie ustawia automatycznie tej zmiennej, musi to zostać wyraźnie wykonane przez aplikację zmieniającą identyfikator użytkownika), a także mogła zostać zmodyfikowana przez jakiś inny proces z przodków powłoki.$LOGNAME
, z tym samym zastrzeżeniem jest bardziej niezawodne, ponieważ jest określone przez POSIX (pierwotnie z FIPS 151-2)źródło
Możesz użyć
$USER
lub,whoami
aby sprawdzić bieżącego użytkownika.źródło
3.2.4.2 Conditional Constructs
3.5.4 Command Substitution
id -u
z-n
opcją lub bez jest alternatywą dla korzystania z whoami. Bez -n i porównywanie do zera jest lepszym dopasowaniem do testu, który faktycznie wykonuje jądro. Jedyne, na czym zależy jądro, to identyfikator, a nie nazwa z pliku haseł.$(id -u)
jest lepsze. W niektórych (złośliwych) przypadkach$USER
może być źle.To, czego naprawdę chcesz, to ustalić, czy masz dostęp do wykonywania tych operacji. Sprawdzanie, czy zamiast tego jesteś rootem, jest uważane za złą praktykę.
Jeśli system został skonfigurowany tak, aby zezwolić użytkownikowi innemu niż root na modyfikowanie zamiany i upuszczanie pamięci podręcznej strony, dlaczego ten użytkownik nie powinien uruchomić skryptu?
Zamiast tego możesz po prostu spróbować wykonać operację i wyjść z pomocnym komunikatem, jeśli się nie powiedzie:
źródło
exit
gdy coś się nie powiedzie, na wypadek, gdyby użytkownik chciał zrobić tyle, ile może, korzystając z obecnych uprawnień. (Ale w typowym systemie, w którym wszystko to wymaga rootowania, wyjście byłoby bardziej użyteczne / mniej głośne.)