Hier ist meine Quelle:
#!/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 "";
Es löscht Caches und andere Daten und gibt an, dass es als Root im Terminal ausgeführt werden muss. Ich möchte im Grunde nur, dass das Skript nicht mehr ausgeführt wird, wenn es feststellt, dass es nicht als root ausgeführt wird.
Beispiel:
"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..."
Wenn es mit erhöhten Rechten ausgeführt wird, wird es wie gewohnt ausgeführt. Irgendwelche Ideen? Vielen Dank!
shell-script
root
M. Knepper
quelle
quelle
root
durch Vorfixierung prefix alle Befehle , die ausgeführt werden müssen , wieroot
mitsudo
.Antworten:
Der Root-Benutzer hat die UID 0 (unabhängig vom Namen des "Root" -Kontos). Wenn die von zurückgegebene effektive UID
id -u
nicht Null ist, führt der Benutzer das Skript nicht mit Root-Rechten aus. Verwenden Sieid -ru
zum Test gegen die reale ID (die UID des Benutzers Aufruf des Skripts).Nicht
$EUID
im Skript verwenden, da dies von einem nicht privilegierten Benutzer geändert werden kann:Wenn ein Benutzer dies tun würde, würde dies offensichtlich nicht zu einer Eskalation der Rechte führen, sondern könnte dazu führen, dass Befehle im Skript nicht in der Lage sind, das zu tun, was sie tun sollen, und dass Dateien mit dem falschen Eigentümer erstellt werden usw.
quelle
/bin/id -u
gibt es/bin/id: illegal option -- u
Usage: id [-ap] [user]
/usr/xpg4/bin
frühzeitig$PATH
Zugriff auf POSIX-Dienstprogramme unter Solaris haben.-u
Option vonid
nicht universell ist und daher diese Lösung nur mit dem Vorbehalt universell ist, dass eine POSIX-Version vonid
zuerst in Ihrem PATH auftreten muss.$PATH
oben im Skript so, dass sie/usr/xpg4/bin
zuvor angezeigt wurden/bin
. Wenn Sie darauf bestehen, Nicht-POSIX zu verwendenid
, müssen Sie natürlich eine tragbarere Lösung finden.PATH=$( getconf PATH )
einen anderen expliziten Standardpfad verwenden oder festlegen oder einen expliziten Pfad zum Aufrufen verwendenid
.Ich denke, was Sie wollen, ist eher zu überprüfen, ob Sie Super-User-Berechtigungen haben, das heißt, dass Ihre effektive Benutzer-ID 0 ist.
zsh
undbash
stellen$EUID
Sie dies in der Variablen zur Verfügung, damit Sie Folgendes tun können:Mit allen POSIX-ähnlichen Shells können Sie den
id
Standardbefehl verwenden:Beachten Sie, dass alle
id -un
oderwhoami
oder die$USERNAME
Variable inzsh
Ihnen den ersten Benutzernamen für die UID erhalten. Auf Systemen mit anderen Benutzern mit der ID 0 ist dies möglicherweise nicht der Fall,root
auch wenn der Prozess ein Nachkomme eines Prozesses ist, der als authentifiziert wurderoot
.$USER
würde Ihnen normalerweise den Benutzer geben, der sich authentifiziert, aber sich darauf zu verlassen, ist ziemlich spröde. Es ist nicht von dem Shell gesetzt, sondern wird in der Regel durch den authentifizierten Befehl (wie festgelegtlogin
,su
(auf GNU / Linux - Systeme, die nicht unbedingt andere)sudo
,sshd
(der einer von OpenSSH zumindest) ...). Dies ist jedoch nicht immer der Fall (das Ändern der UID setzt diese Variable nicht automatisch, sondern muss explizit von der Anwendung vorgenommen werden, die die UID ändert) und könnte auch durch einen anderen Prozess in der Vorfahren der Shell geändert worden sein.$LOGNAME
, mit dem gleichen Vorbehalt ist zuverlässiger als es von POSIX angegeben wird (ursprünglich von FIPS 151-2)quelle
Mit
$USER
oderwhoami
können Sie den aktuellen Benutzer überprüfen.quelle
3.2.4.2 Conditional Constructs
3.5.4 Command Substitution
id -u
mit oder ohne-n
Option ist eine Alternative zur Verwendung von whoami. Ohne ein -n und einen Vergleich mit Null ist eine bessere Übereinstimmung mit dem Test, den der Kernel tatsächlich durchführt. Der Kernel kümmert sich nur um die ID und nicht um den Namen aus der Passwortdatei.$(id -u)
besser ist. In einigen (böswilligen) Fällen$USER
könnte das falsch sein.Was Sie tatsächlich wollen, ist festzustellen, ob Sie Zugriff auf diese Vorgänge haben. Es wird als schlechte Praxis angesehen, stattdessen zu prüfen, ob Sie Root sind oder nicht.
Wenn das System so konfiguriert wurde, dass ein Benutzer ohne Rootberechtigung den Swap- und Drop-Page-Cache ändern kann, warum sollte dieser Benutzer dann nicht das Skript ausführen können?
Stattdessen können Sie die Operation einfach ausprobieren und mit einer hilfreichen Meldung beenden, falls dies fehlschlägt:
quelle
exit
nachdem etwas fehlgeschlagen ist, falls der Benutzer mit seinen aktuellen Berechtigungen so viel wie möglich tun möchte. (Aber für ein typisches System, bei dem dies alles root erfordert, wäre das Beenden nützlicher / weniger laut.)