Das Folgende gilt für den Fall, dass Sie einen Befehl nur dann ohne Kennwort ausführen möchten, wenn er über einen bestimmten Optionssatz verfügt, bei dem ein Teil der Optionen variabel ist . AFAIK Es ist nicht möglich, Variablen oder Wertebereiche in sudoers-Deklarationen zu verwenden, dh Sie können den Zugriff explizit erlauben, command option1
ohne Folgendes zu command option2
verwenden:
user_name ALL=(root) /usr/bin/command option1
aber wenn die Struktur command option1 value1
, wo value1
variieren kann, müßten Sie explizite sudoers Linien für jeden möglichen Wert haben value1
. Shell-Skript bietet einen Weg, um es zu umgehen.
Diese Antwort wurde von der Antwort von M. Ahmad Zafar inspiriert und behebt das dortige Sicherheitsproblem.
- Erstellen Sie ein Shell-Skript, in dem Sie den Befehl ohne aufrufen
sudo
.
- Speichern Sie das Skript in einem Ordner mit Root-Rechten (z. B.
/usr/local/bin/
), und legen Sie fest, dass sich die Datei im Root-Besitz befindet (z. B. chown root:wheel /usr/local/bin/script_name
), ohne dass andere Benutzer Schreibzugriff haben (z chmod 755 /usr/local/bin/script_name
. B. ).
Fügen Sie Sudoern mit visudo die Ausnahme hinzu:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
Führen Sie Ihr Skript aus sudo script_name
.
Ich möchte beispielsweise das Zeitlimit für den Ruhezustand der Anzeige unter macOS ändern. Dies geschieht mit:
sudo pmset displaysleep time_in_minutes
Ich betrachte das Ändern des Sleep-Timeouts als unschuldige Handlung, die den Aufwand der Kennworteingabe nicht rechtfertigt, aber pmset
viele Dinge kann und ich möchte diese anderen Dinge hinter dem sudo-Kennwort belassen.
Ich habe also folgendes Skript bei /usr/local/bin/ds
:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
Am Ende der sudoers
Datei habe ich die folgende Zeile:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Um das Zeitlimit auf 3 Minuten festzulegen, führe ich mein Skript über das normale Benutzerkonto aus user_name
:
sudo ds 3
PS: Der größte Teil meines Skripts ist die Eingabevalidierung, die nicht obligatorisch ist. Daher würde auch Folgendes funktionieren:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
ein Python-Skript wäre?