Ich habe ein Programm, das sich anders verhalten sollte, wenn es unter "sudo" ausgeführt wird. Gibt es eine Möglichkeit herauszufinden, ob es unter sudo ausgeführt wurde?
Update: Jemand fragte, warum ich das tun möchte. In diesem Fall wird auf einem Mac mit MacPorts eine Ausgabe ausgegeben, in der Sie aufgefordert werden, einen bestimmten Befehl auszuschneiden und einzufügen. Wenn der MacPorts-Befehl mit "sudo" ausgeführt wurde, sollte sudo im Beispielbefehl enthalten sein:
$ sudo port selfupdate
---> Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
---> Updating the ports tree
---> MacPorts base is already the latest version
The ports tree has been updated. To upgrade your installed ports, you should run
port upgrade outdated
^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead. It would be even better if it just did it for you :-)
Antworten:
Ja, es sind 4 Umgebungsvariablen festgelegt, wenn ein Programm unter sudo ausgeführt wird:
Beachten Sie, dass diese gefälscht werden können, indem Sie sie einfach einstellen. Vertraue ihnen für nichts Kritisches.
Zum Beispiel: In diesem Programm müssen wir den Benutzer anweisen, ein anderes Programm auszuführen. Wenn der aktuelle mit sudo ausgeführt wurde, wird der andere ebenfalls ausgeführt.
Beachten Sie, dass nur dann auf eine SUDO_ * -Variable geprüft wird, wenn zuerst nachgewiesen werden kann, dass sie als root ausgeführt wird. Selbst dann wird es nur zum Ändern von hilfreichem Text verwendet.
quelle
Dies beantwortet die Frage nicht direkt, aber ich denke nicht, dass hier die richtige Frage gestellt wird. Mir scheint, der Fragesteller möchte ein Programm, das sich vermutlich anders verhält, wenn es bestimmte Berechtigungen hat oder nicht. Ich würde jedoch argumentieren, dass das Überprüfen auf sudo nicht der richtige Weg ist. Erstens können viele Systeme kein "sudo" implementieren, es ist auf keinen Fall unter Linux oder vielen Unixen erforderlich.
Beispielsweise ist ein Benutzer möglicherweise bereits als root angemeldet, was das sudo unsinnig macht, oder das System verfügt möglicherweise über Benutzer ohne Rootberechtigung, die weiterhin die vom Programm gewünschten Verwaltungsaufgaben ausführen können. Schließlich hat das System vielleicht überhaupt kein root oder sudo und verwendet stattdessen ein obligatorisches Zugriffskontrollsystem mit unterschiedlichen Fähigkeiten und keinen Zugriff auf alle Superuser, in die sudo soll. Oder der Benutzer kann sudoed werden, aber aus Sicherheitsgründen in ein Konto, das -less- Berechtigungen als sein eigenes Konto hat (Ich führe häufig nicht vertrauenswürdigen Code mit einem temporären nichtprivilegierten Benutzer aus, der nur auf RAM-Disks schreiben kann, um meine Berechtigungen zu löschen, nicht aber zu erhöhen ). Es ist insgesamt eine schlechte Idee, ein bestimmtes Berechtigungsmodell wie sudo oder das Vorhandensein von root anzunehmen oder anzunehmen, dass ein sudo-Benutzer über bestimmte Berechtigungen verfügt.
Wenn Sie herausfinden möchten, ob Sie über Berechtigungen zum Ausführen eines Vorgangs verfügen, versuchen Sie es in der Regel einfach und überprüfen Sie errno auf Berechtigungsprobleme, wenn der Vorgang fehlschlägt oder wenn es sich um einen mehrstufigen Vorgang handelt, bei dem entweder alle fehlschlagen oder alle erfolgreich sind Sie können überprüfen, ob eine Operation mit Funktionen wie der POSIX- Zugriffsfunktion funktioniert (achten Sie hier auf mögliche Rennbedingungen, wenn Berechtigungen aktiv geändert werden).
Wenn Sie zusätzlich den tatsächlichen Benutzer hinter dem sudo kennen müssen, können Sie die getlogin- Funktion verwenden, die für jede interaktive Sitzung mit einem zugrunde liegenden Terminal funktionieren sollte und es Ihnen beispielsweise ermöglichen würde, herauszufinden, wer den Befehl für die Prüfung „wirklich“ ausführt, oder die Funktion zu finden Ausgangsverzeichnis des realen Benutzers zum Speichern von Protokollen.
Wenn Sie wirklich herausfinden möchten, ob ein Benutzer über Root-Zugriff verfügt (immer noch eine schlechte Idee, aber weniger implementierungsspezifisch), können Sie getuid verwenden , um nach einer UID von 0 und damit root zu suchen.
quelle
Es gibt zwei Mechanismen, die verwendet werden können.
growisofs
läuft nicht gerne unter SUDO, daher habe ich die SUDO-Variablen in Skripten, in denen ich sie verwende, deaktiviert. Es kann auch anders herum gefälscht werden. (Die SUDO-Variablen werden auch für Skripte in die Umgebung übertragen, die unter den Befehlen at und batch ausgeführt werden.)Es ist üblicher, zu überprüfen, ob Sie als der entsprechende Benutzer ausgeführt werden. Der
id
Befehl kann dazu verwendet werden. Das Skript von TomOnTime verwendet denid
Befehl, um festzustellen, obsudo
möglicherweise der nächste Befehl ausgeführt werden muss.quelle
sudo
Binärdatei nicht einfach in etwas anderes umbenennen ? Oder nennen Sie eine andere ausführbare Dateisudo
, um das Gegenteil vorzutäuschen? Nicht, dass ich wirklich erwarten würde, dass das jemand Vernünftiges tut ...root
Zugriff, um diesudo
ausführbare Datei umzubenennen . Ein normaler Benutzer wäre dazu nicht in der Lage. Ich habe bemerkt, dass Sie vortäuschen können, dass Sie unterlaufensudo
. Das Umbenennen eines vorhandenen Programms würde funktionieren. Der Code, der für ein spezielles Fake-sudo
Programm benötigt wird, ist trivial.Sie können die effektive mit der tatsächlichen Benutzer-ID vergleichen.
Dies bedeutet nicht unbedingt, dass es die Funktion "sudo rückgängig machen" ausführt (kann auch festgelegt werden), weist jedoch darauf hin, dass das Programm über mehr Rechte verfügt, als der Benutzer möglicherweise erwartet. (Zum Beispiel in einem Programm, das normalerweise ohne solche Rechte ausgeführt wird, aber während der Installation mit diesen ausgeführt werden muss oder um Updates zu installieren. Dann können Sie dies verwenden, um ein warnendes Feedback dazu zu geben.)
quelle
sudo
setzt sowohl die effektive als auch die reale ID. Im Gegensatz zu Suid, was nicht der Fall ist. Hier ist ein triviales C-Programm, mit dem Sie testen können (der Kommentar entfernt Zeilenumbrüche, Sie müssen sie wieder hinzufügen):#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
perl -E 'say $<, "\n", $>'
Sie können die effektive UID-Variable (EUID) wie folgt überprüfen:
quelle
sudo echo $USER
der nichtprivilegierte Benutzername ausgegeben wird (die Variable wird VOR dem Sudo ersetzt). Schließlich habe ich Ihren Code in meinem Skript verwendet. Vielen Dank!Sie können eine Datei in
/root
und dann berührenif -e
. Und wenn -e wahr istrm
(Überprüfung des Fehlercodes), funktioniert der Test beim nächsten Mal.Das Überprüfen des Fehlercodes (oder des Rückkehrcodes) nach dem rm verhindert, dass jemand die sudo powers verwendet, um die Datei zu erstellen, die Ihnen einen Streich spielt.
quelle
/root
(was nicht unbedingt mit der Ausführung mit UID 0 identisch ist), prüft jedoch nicht, ob er über diese Berechtigungen verfügtsudo
.Ich fand, dass dies gut dafür funktioniert
quelle