GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kann ein Programm erkennen, dass es unter sudo ausgeführt wird?

Lösung 1:

Ja, es werden 4 Umgebungsvariablen gesetzt, wenn ein Programm unter sudo läuft:

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20

Beachten Sie, dass diese gefälscht werden können, indem Sie sie einfach setzen. Vertrauen Sie ihnen nicht für etwas Kritisches.

Zum Beispiel:In diesem Programm müssen wir dem Benutzer sagen, dass er ein anderes Programm ausführen soll. Wenn der aktuelle mit sudo ausgeführt wurde, wird der andere es auch tun.

#!/bin/bash

echo 'Thank you for running me.'

if [[ $(id -u) == 0 ]]; then
  if [[ -z "$SUDO_COMMAND" ]]; then
    echo 'Please now run: next_command'
  else
    echo 'Please now run: sudo next_command'
  fi
else  echo 'Error: Sadly you need to run me as root.'
  exit 1
fi

Beachten Sie, dass es nur auf eine SUDO_*-Variable testet, wenn es zuerst beweisen kann, dass es als Root ausgeführt wird. Selbst dann wird es nur verwendet, um hilfreichen Text zu ändern.

Lösung 2:

Dies beantwortet die Frage nicht direkt, aber ich glaube nicht, dass hier die richtige Frage gestellt wird. Es scheint mir, dass der Fragesteller ein Programm will, das sich vermutlich anders verhält, wenn es bestimmte Berechtigungen hat oder nicht, aber ich würde argumentieren, dass die Überprüfung auf sudo nicht der richtige Weg ist. Erstens implementieren viele Systeme möglicherweise kein "sudo", es ist auf keinen Fall unter Linux oder vielen Unixen erforderlich.

Zum Beispiel kann ein Benutzer bereits als root angemeldet sein, was das sudo unsinnig macht, oder vielleicht hat das System nicht-root-Benutzer, die immer noch über die Fähigkeit verfügen, die administrative Aufgabe auszuführen, die das Programm möglicherweise ausführen möchte. Schließlich hat das System vielleicht überhaupt kein root oder sudo und verwendet stattdessen ein obligatorisches Zugriffskontrollsystem mit unterschiedlichen Fähigkeiten und ohne Catch all Superuser, in die sudo eintreten kann. Oder der Benutzer könnte sudoed werden, aber aus Sicherheitsgründen in ein Konto, das weniger Berechtigungen als sein eigenes Konto hat (ich führe oft nicht vertrauenswürdigen Code mit einem temporären nicht privilegierten Benutzer aus, der nur auf Ramdisks schreiben kann, um meine Berechtigungen zu löschen, nicht zu erhöhen ). Es ist insgesamt eine schlechte Idee, ein bestimmtes Berechtigungsmodell wie sudo oder die Existenz von root anzunehmen oder anzunehmen, dass ein sudoed-Benutzer bestimmte Berechtigungen hat.

Wenn Sie herausfinden möchten, ob Sie die Berechtigungen zum Ausführen einer Operation haben, ist es normalerweise am besten, es einfach zu versuchen und dann errno auf Berechtigungsprobleme zu überprüfen, wenn es fehlschlägt oder wenn es sich um eine mehrstufige Operation handelt, die entweder alle fehlschlagen oder alle erfolgreich sein müssen Sie können überprüfen, ob eine Operation mit Funktionen wie der POSIX-Zugriffsfunktion funktioniert (achten Sie hier auf mögliche Race-Conditions, wenn Berechtigungen aktiv geändert werden)

Wenn Sie zusätzlich den echten 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 zur Überwachung „wirklich“ ausführt, oder den zu finden Home-Verzeichnis des echten Benutzers, um Protokolle zu speichern.

Schließlich, wenn Sie wirklich herausfinden möchten, ob ein Benutzer Root-Zugriff hat (immer noch eine schlechte Idee, aber weniger implementierungsspezifisch), können Sie getuid verwenden, um nach einer UID von 0 und damit root zu suchen.

Lösung 3:

Es gibt zwei Mechanismen, die verwendet werden können.

  • Die Überprüfung der Umgebungsvariablen kann so oder so vorgetäuscht werden, ist aber am einfachsten. growisofs läuft nicht gerne unter SUDO, also deaktiviere ich die SUDO-Variablen in Skripten, in denen ich es verwende. Es kann auch anders gefälscht werden. (Die SUDO-Variablen werden auch in die Umgebung für Skripte übertragen, die unter den Befehlen at und batch ausgeführt werden.)
  • Eine andere Möglichkeit, um festzustellen, ob Sie unter sudo laufen, besteht darin, die Prozessliste Ihres übergeordneten Prozesses nach oben zu durchsuchen und nach sudo zu suchen. Es wäre schwierig zu verbergen, dass Sie auf diese Weise unter sudo ausgeführt wurden, aber es ist komplexer. Es ist immer noch möglich vorzutäuschen, dass Sie unter sudo laufen.

Es ist üblicher zu überprüfen, ob Sie als der richtige Benutzer ausgeführt werden. Die id Befehl kann dazu verwendet werden. Das Skript von TomOnTime verwendet den id Befehl, um festzustellen, ob sudo möglicherweise erforderlich, um den nächsten Befehl auszuführen.

Lösung 4:

Sie können die tatsächliche mit der tatsächlichen Benutzer-ID vergleichen.

Dies bedeutet nicht unbedingt, dass es undo sudo ausführt (könnte auch setuid'd sein), sondern zeigt an, dass das Programm mehr Rechte hat, als der Benutzer erwarten könnte (z. B. in einem Programm, das normalerweise ohne solche Rechte ausgeführt wird, aber muss). mit ihnen während der Installation ausgeführt werden oder um Updates zu installieren. Dann können Sie dies verwenden, um ein Warn-Feedback darüber zu geben).

Lösung 5:

Sie können die effektive UID-Variable (EUID) wie folgt prüfen:

if [[ $EUID -eq 0 ]]; then
    echo "running as root"
else
    echo "not running as root"
fi

Linux
  1. Ssh – Benötigen Sie ein Tty, um Sudo auszuführen, wenn ich Sudo ohne Passwort ausführen kann?

  2. 32-Bit-App unter 64-Bit-Linux ausführen?

  3. Kann Python erkennen, unter welchem ​​Betriebssystem es läuft?

  4. Kann GDB den Assemblercode eines laufenden Programms ändern?

  5. sudoers NOPASSWD:sudo:kein tty vorhanden und kein askpass-Programm angegeben

Shell-Skript parallel ausführen

Wie kann ich PhantomJS auf Ubuntu einrichten und ausführen?

Führen Sie ein Java-Programm im Backend aus

Farbausgabe des unter BASH ausgeführten Programms

Führen Sie ifconfig ohne sudo aus

Führen Sie den cd-Befehl als Superuser unter Linux aus