it-swarm.com.de

Wie führe ich ein bestimmtes Programm als root ohne Passwortabfrage aus?

Ich muss etwas als Sudo ohne Passwort ausführen, also habe ich visudo verwendet und dies meiner sudoers -Datei hinzugefügt:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Dann habe ich es ausprobiert:

$ Sudo /path/to/my/program
[Sudo] password for MYUSERNAME: 

Warum wird nach einem Passwort gefragt? Wie kann ich Befehle als root mit einem Nicht-root-Benutzer ausführen/verwenden, ohne nach einem Passwort zu fragen?

175
LanceBaynes

Sie haben einen weiteren Eintrag in der Datei sudoers , der sich normalerweise unter /etc/sudoers Befindet und ebenfalls Ihrem Benutzer entspricht. Die NOPASSWD -Regel muss nach dieser Regel stehen, damit sie Vorrang hat.

Danach fordert Sudo normalerweise für alle Befehle mit Ausnahme von /path/to/my/program Ein Kennwort auf, mit dem Sie immer ausgeführt werden können, ohne nach Ihrem Kennwort zu fragen.

97
Warren Young

Wenn in /etc/sudoers Mehrere übereinstimmende Einträge vorhanden sind, verwendet Sudo den letzten. Wenn Sie also einen Befehl mit einer Kennwortabfrage ausführen können und einen bestimmten Befehl ohne Kennwortabfrage ausführen möchten, benötigen Sie die letzte Ausnahme.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Beachten Sie die Verwendung von (root), Damit das Programm als Root, aber nicht als andere Benutzer ausgeführt werden kann. (Geben Sie nicht mehr Berechtigungen als das erforderliche Minimum, es sei denn, Sie haben die Auswirkungen durchdacht.)

Hinweis für Leser, die Ubuntu nicht ausführen oder die Standard-Sudo-Konfiguration geändert haben (Ubuntus Sudo ist standardmäßig in Ordnung) : Ausführen von Shell-Skripten mit erhöhten Berechtigungen ist riskant, Sie müssen von einer sauberen Umgebung aus starten (sobald die Shell gestartet wurde, ist es zu spät (siehe Setuid für Shell-Skripte zulassen ), also brauchen Sie Sudo, um sich darum zu kümmern). Stellen Sie sicher, dass Sie Defaults env_reset In /etc/sudoers Haben oder dass diese Option die Standardeinstellung für die Kompilierung ist (Sudo sudo -V | grep env Sollte Reset the environment to a default set of variables Enthalten).

[~ # ~] Warnung [~ # ~] : Diese Antwort wurde als unsicher eingestuft. Siehe Kommentare unten

Vollständige Lösung: Die folgenden Schritte helfen Ihnen, die gewünschte Ausgabe zu erzielen:

  1. Erstellen Sie eine neue Skriptdatei (ersetzen Sie create_dir.sh mit Ihrem gewünschten Skriptnamen):

    vim ~/create_dir.sh
    

    Das Skript wird im Home-Verzeichnis des Benutzers erstellt

  2. Fügen Sie einige Befehle hinzu, die nur ein Benutzer von root oder Sudo ausführen kann, z. B. das Erstellen eines Ordners auf der Ebene des Stammverzeichnisses:

    mkdir /abc
    

    Hinweis: Fügen Sie diesen Befehlen kein Sudo hinzu. Speichern und beenden (mit :wq!)

  3. Weisen Sie ihm Ausführungsberechtigungen zu, indem Sie:

    Sudo chmod u+x create_dir.sh
    
  4. Nehmen Sie Änderungen vor, damit für dieses Skript kein Kennwort erforderlich ist.

    1. Öffnen Sie die Datei sudoers:

      Sudo visudo -f /etc/sudoers
      
    2. Fügen Sie am Ende die folgende Zeile hinzu:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Ersetzen Sie ahmad durch einen beliebigen Benutzernamen. Stellen Sie außerdem sicher, dass dies die letzte Zeile ist. Speichern und schließen.

  5. Wenn Sie nun den Befehl ausführen, fügen Sie Sudo hinzu, bevor Sie Folgendes tun:

    Sudo ./create_dir.sh
    

    Dadurch werden die Befehle in der Skriptdatei ausgeführt, ohne nach einem Kennwort zu fragen.

Befolgen Sie die hier genannten einfachen Schritte http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

24
M. Ahmad Zafar

Ich denke, deine Syntax ist falsch. Zumindest benutze ich Folgendes, was für mich funktioniert:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
12
musiKk

Wenn Sie vermeiden möchten, Sudo verwenden oder die sudoers-Konfigurationsdatei ändern zu müssen, können Sie Folgendes verwenden:

Sudo chown root:root path/to/command/COMMAND_NAME
Sudo chmod 4775 path/to/command/COMMAND_NAME

Dadurch wird der Befehl als Root ausgeführt, ohne dass Sudo erforderlich ist.

6
linuxgnuru

Wenn Sie eine Distribution wie Manjaro haben, müssen Sie sich zuerst mit einer Datei befassen, die die Definition von/etc/sudoers überschreibt. Sie können sie löschen oder direkt mit dieser Datei arbeiten, um Ihre neuen Konfigurationen hinzuzufügen.

Diese Datei ist:

Sudo cat /etc/sudoers.d/10-installer

Die einzige Möglichkeit, dies zu sehen, sind Root-Berechtigungen. Sie können dieses Verzeichnis nicht ohne dieses Verzeichnis auflisten. Diese Datei ist Manjaro-spezifisch. Möglicherweise haben Sie diese Konfiguration mit einem anderen Namen gefunden, jedoch im selben Verzeichnis.

In der Datei Ihrer Wahl können Sie die folgenden Zeilen hinzufügen, um die gewünschte (n) Konfiguration (en) zu erhalten:

Ignorieren Sie die Authentifizierung für eine Gruppe

%group ALL=(ALL) NOPASSWD: ALL

oder Authentifizierung für einen Benutzer ignorieren

youruser ALL=(ALL) NOPASSWD: ALL

oder Authentifizierung einer ausführbaren Datei für einen bestimmten Benutzer ignorieren

youruser ALL=(ALL) NOPASSWD: /path/to/executable

SCHNELLER HINWEIS: Sie öffnen eine Tür, um Sudo ohne Authentifizierung zu verwenden. Das bedeutet, dass Sie alles ausführen können, indem Sie alles von Ihrem System aus ändern und es verantwortungsbewusst verwenden.

5
Lyoneel

Stellen Sie sicher, dass Sudo nicht mit einem Alias ​​versehen ist. Lauf so

/usr/bin/Sudo /path/to/my/program

Zum Beispiel ein Shell-Alias ​​wie dieser:

alias Sudo="Sudo env PATH=$PATH"

kann dieses Verhalten verursachen.

4
Sepero

Dies löste das Problem für mich (versuchte auch einige der anderen Antworten, die vielleicht geholfen haben):

Das Skript, das ich aufrief, war in /usr/bin, ein Verzeichnis, in das ich keine Schreibberechtigung habe (obwohl ich dort normalerweise alle Dateien lesen kann). Das Skript war chmodded + x (ausführbare Erlaubnis), aber es funktionierte immer noch nicht. Verschieben dieser Datei in einen Pfad in meinem Home-Verzeichnis anstelle von /usr/bin, Ich konnte es endlich mit Sudo anrufen, ohne ein Passwort einzugeben.

Auch etwas, an dem ich gezweifelt habe (Klarstellung für zukünftige Leser): Sie müssen Ihr Skript als Sudo ausführen. Geben Sie Sudo ein, wenn Aufruf das Skript. Verwenden Sie Sudo nicht für den Befehl in Ihrem Skript, der tatsächlich root benötigt (in meinem Fall wird die Hintergrundbeleuchtung der Tastatur geändert). Vielleicht funktioniert das auch, aber Sie müssen nicht, und es scheint eine bessere Lösung zu sein, dies nicht zu tun.

2
Luc

Wenn Sie Ihr Skript ausführen, müssen Sie es als Sudo /path/to/my/script Ausführen.

Bearbeiten : Basierend auf Ihrem Kommentar zu einer anderen Antwort möchten Sie dies über ein Symbol ausführen. Sie müssen eine .desktop - Datei erstellen, die Ihr Programm mit Sudo ausführt, genau wie auf dem Terminal.

Sie können auch gtk-Sudo Für eine visuelle Passwortabfrage verwenden.

Sie sollten wahrscheinlich die Idee in Betracht ziehen, dass Sie Dinge nicht als Root ausführen sollten und dass es ein besserer Weg wäre, das System weiter unten zu ändern, sodass Sie überhaupt keine Root-Berechtigungen benötigen.

2
Caleb

Eine andere Möglichkeit könnte darin bestehen, das Skript als zu installieren, zu konfigurieren und dann mit dem Befehl super auszuführen

super /path/to/your/script

Wenn Sie eine Binärdatei ausführen möchten ausführbare Datei (z. B. die Sie in ELF Binärdatei aus einem C-Quellcode kompiliert haben) - was ist nicht ein Skript - als root könnten Sie in Betracht ziehen, es zu erstellen setuid (und tatsächlich /bin/login, /usr/bin/Sudo und /bin/su und super verwenden alle diese Technik). Seien Sie jedoch sehr vorsichtig, Sie könnten eine große Sicherheitslücke öffnen .

Konkret sollte Ihr Programm paranoisch codiert sein (überprüfen Sie also alle Argumente und die Umgebung sowie die äußeren Bedingungen, bevor Sie "handeln", unter der Annahme eines potenziell feindlichen Benutzers), dann können Sie seteuid (2) und friends (siehe) verwenden auch setreuid (2) ) sorgfältig (siehe auch Fähigkeiten (7) & Anmeldeinformationen (7) & ausführen (2) ...)

Sie verwenden chmod u+s (read chmod (1) ) bei der Installation einer solchen Binärdatei.

Aber sei sehr vorsichtig .

Lesen Sie viele Dinge über setuid, einschließlich Advanced Linux Programming , bevor Sie so etwas codieren.

Beachten Sie, dass ein Skript oder ein beliebiges Shebang - ed-Element nicht festgelegt werden kann. Sie können jedoch (in C) eine kleine Setuid-Binärdatei codieren, die sie umschließt.

Wenn Sie anpassen, welche Befehle über Sudo ausgeführt werden können, sollten Sie diese Änderungen idealerweise in einer separaten Datei unter /etc/sudoers.d/ Vornehmen, anstatt die Datei sudoers direkt zu bearbeiten. Sie sollten auch immer visudo verwenden, um die Datei (en) zu bearbeiten. Sie sollten NIEMALS NOPASSWD für ALL Befehle erteilen.

Beispiel: Sudo visudo -f /etc/sudoers.d/mynotriskycommand

Fügen Sie Ihre Zeile ein, die die Berechtigung erteilt: myuser ALL= NOPASSWD: /path/to/your/program

Speichern und beenden Sie dann und visudo warnt Sie, wenn Sie Syntaxfehler haben.

Sie können Sudo -l Ausführen, um die Berechtigungen anzuzeigen, die Ihrem Benutzer erteilt wurden, wenn einer der benutzerspezifischen NOPASSWD -Befehle VOR einem %groupyouarein ALL=(ALL) ALL -Befehl in der Ausgabe angezeigt wird Sie werden zur Eingabe Ihres Passworts aufgefordert.

Wenn Sie feststellen, dass Sie viele dieser sudoers.d-Dateien erstellen, möchten Sie sie möglicherweise mit einem Namen pro Benutzer erstellen, damit sie leichter zu visualisieren sind. Beachten Sie, dass die Reihenfolge der DATEINAMEN und der REGELN in der Datei sehr wichtig ist. Der LETZTE, der geladen wird, gewinnt, unabhängig davon, ob er MEHR oder WENIGER zulässig ist als die vorherigen Einträge.

Sie können die Reihenfolge der Dateinamen mit einem Präfix von 00-99 oder aa/bb/cc steuern. Beachten Sie jedoch auch, dass Dateien, die kein numerisches Präfix haben, nach den nummerierten Dateien geladen werden und überschrieben werden Einstellungen. Dies liegt daran, dass abhängig von Ihren Spracheinstellungen die "lexikalische Sortierung" der Shell zuerst Sortiernummern verwendet und dann beim Sortieren in "aufsteigender" Reihenfolge möglicherweise Groß- und Kleinschreibung verschachtelt.

Versuchen Sie, printf '%s\n' {{0..99},{A-Z},{a-z}} | sort Und printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort Auszuführen, um festzustellen, ob Ihre aktuelle Sprache AaBbCc etc oder ABC und dann abc druckt, um festzustellen, was die beste "zuletzt" ist "zu verwendendes Buchstabenpräfix wäre.

0
dragon788

Alternativ können Sie das Paket python pudo ) verwenden.

Installation:

user$ Sudo -H pip3 install pudo # you can install using pip2 also

Unten finden Sie das Code-Snippet für die Verwendung in python Automation zum Ausführen von Befehlen unter Root-Berechtigungen:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

Unten finden Sie das cmd-Beispiel zum Ausführen von Befehlen unter Root-Berechtigungen:

user$ pudo ls /root
Desktop  Downloads  Pictures  Music
0

Damit jeder Benutzer ein Programm als Sudo ausführen kann, ohne nach dem Passwort zu fragen, können Sie die folgende Zeile hinzufügen

%Sudo ALL=(root) NOPASSWD: /path/to/your/program

im /etc/sudoers

Beachten Sie, dass % Sudo es schaffen.

0
ultimatex

Das Folgende gilt für den Fall, dass Sie einen Befehl ohne Kennwort nur ausführen möchten, wenn er über einen bestimmten Satz von Optionen verfügt, wobei ein Teil der Optionen variabel ist. AFAIK Es ist nicht möglich, Variablen oder Wertebereiche in Sudoers-Deklarationen zu verwenden, d. H. Sie können den expliziten Zugriff auf command option1 Erlauben, jedoch nicht auf command option2 Mit:

user_name ALL=(root) /usr/bin/command option1

wenn die Struktur jedoch command option1 value1 ist, wobei value1 variieren kann, müssten für jeden möglichen Wert von value1 explizite Sudoer-Zeilen vorhanden sein. 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.

  1. Erstellen Sie ein Shell-Skript, in dem Sie den Befehl ohne Sudo aufrufen.
  2. Speichern Sie das Skript in einem Ordner mit Root-Rechten (z. B. /usr/local/bin/), Und machen Sie die Datei im Root-Besitz (z. B. chown root:wheel /usr/local/bin/script_name) Ohne Schreibzugriff für andere (z. B. chmod 755 /usr/local/bin/script_name).
  3. Fügen Sie Sudoern mit visudo die Ausnahme hinzu:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Führen Sie Ihr Skript Sudo script_name Aus.

Zum Beispiel möchte ich das Zeitlimit für die Anzeige des Ruhezustands unter macOS ändern. Dies geschieht mit:

Sudo pmset displaysleep time_in_minutes

Ich betrachte das Ändern des Ruhezeitlimits als eine unschuldige Aktion, die den Aufwand beim Eingeben von Passwörtern nicht rechtfertigt, aber pmset kann viele Dinge tun, und ich möchte diese anderen Dinge hinter dem Sudo-Passwort behalten.

Ich habe also das folgende Skript unter /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 Datei sudoers steht 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 eine Eingabevalidierung, die nicht obligatorisch ist. Daher würde auch Folgendes funktionieren:

#!/bin/bash
pmset displaysleep $1 
0
Koit Saarevet