Wie starte ich ein bestimmtes Programm als root ohne Passwortabfrage?

169

Ich muss etwas als sudo ohne Passwort ausführen, also habe ich Folgendes verwendet visudound meiner sudoersDatei 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 mit einem Benutzer ohne Rootberechtigung als root ausführen / verwenden, ohne nach einem Passwort zu fragen?

LanceBaynes
quelle

Antworten:

91

Sie haben einen anderen Eintrag in der sudoersDatei, der auch Ihrem Benutzer entspricht. Die NOPASSWDRegel muss danach sein, damit sie Vorrang hat.

Wenn Sie dies getan haben, sudowerden Sie normalerweise zur Eingabe eines Kennworts für alle Befehle /path/to/my/programaufgefordert, mit Ausnahme von Befehlen , mit denen Sie immer ausgeführt werden können, ohne nach Ihrem Kennwort zu fragen.

Warren Young
quelle
6
würde das noch funktionieren, wenn das /path/to/my/programein Python-Skript wäre?
Sadmicrowave
Kann das Programm stattdessen ein Alias ​​sein, der für bash (dh in .bashrc) gesetzt ist? Oder sogar ein Shell-Skript /usr/local/sbin? Ausprobieren.
Nikos Alexandris
Nikos - nein, es kann kein Alias ​​sein. Es muss auf einen realen Weg weisen.
Paul Hedderly
Sudoer? wo ist? schwer, Ihre Antwort zu verwenden (
Vasilii Suricov
@ VasiliiSuricov: Es ist normalerweise in /etc, aber einige Systeme setzen es woanders. Wenn Sie es nicht finden können, versuchen Sie es man sudoers. Der lokale Speicherort für diese Datei sollte in die manSeite eingesetzt werden, sudoals sie für dieses System erstellt wurde.
Warren Young
135

Wenn mehrere übereinstimmende Einträge vorhanden sind /etc/sudoers, verwendet sudo den letzten. Wenn Sie also einen Befehl mit einer Kennworteingabeaufforderung ausführen können und einen bestimmten Befehl ohne Kennworteingabeaufforderung 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 ausgeführt werden kann, jedoch nicht als anderer Benutzer. (Geben Sie nicht mehr Berechtigungen als das erforderliche Minimum, es sei denn, Sie haben die Auswirkungen herausgefunden.)

Hinweis für Leser, die Ubuntu nicht ausführen oder die Standard-Sudo-Konfiguration geändert haben (Ubuntu-Sudo ist standardmäßig in Ordnung) : Das 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, es ist zu spät (siehe setuid für Shell-Skripte zulassen ), daher brauchen Sie sudo, um das zu erledigen). Stellen Sie sicher , dass Sie Defaults env_resetin /etc/sudoersoder dass diese Option ist die Kompilierung-Standard ( sudo sudo -V | grep envsollte enthalten Reset the environment to a default set of variables).

Gilles
quelle
3
ex, um von jhon mit sudo su und no pass root zu werden -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac
5
@adrian Wenn Sie willkürliche Befehle als root zulassen wollen, machen Sie das john ALL=(ALL) NOPASSWD: all. Es hat keinen Sinn, über zu gehen su.
Gilles
Frage: Soll ich die Berechtigungen meines Shell-Skripts ändern, damit es aus Sicherheitsgründen nur vom Root-Benutzer geändert und gelesen werden kann? Ich denke an einen Angreifer, der das Skript ändert, dem alle Berechtigungen ohne Kennwort erteilt wurden, damit es das tut, was er will. Offensichtlich kann der Angreifer nicht einmal die sudoers-Datei lesen, um zu erfahren, welche Skripte über diese Berechtigung verfügen. Er kann es jedoch mit allen benutzerdefinierten Skripten versuchen, sobald er den Ordner gefunden hat, in dem sie gespeichert sind .
Jeffrey Lebowski
1
@JeffreyLebowski Wenn Sie eine Sudo-Regel haben, die das Skript (direkt oder indirekt) ausführt, ist es wichtig, dass nur Root-Benutzer (oder Benutzer mit Root-Rechten) in die Skriptdatei und in das Verzeichnis mit der Skriptdatei und in schreiben können sein übergeordnetes Verzeichnis und so weiter. Es ist nicht wichtig, dass jemand die Skriptdatei lesen kann (es sei denn, sie enthält ein Passwort oder ähnliches), aber das ist eine schlechte Idee. Wenn es ein Passwort gibt, sollte es in einer eigenen Datei sein, da es sonst zu riskant ist, es versehentlich zu verlieren, z. B. durch Kopieren und Einfügen dieses Codeabschnitts in eine Frage auf dieser Site).
Gilles
1
@alper Nein. Sehr wenige Dinge erfordern einen Neustart. Nach dem Ändern sudoersmüssen Sie nichts Besonderes tun: sudoÜberprüfen Sie es jedes Mal.
Gilles
24

WARNUNG : Diese Antwort wurde als unsicher eingestuft. Siehe Kommentare unten

Komplettlösung: Die folgenden Schritte helfen Ihnen, die gewünschte Ausgabe zu erzielen:

  1. Erstellen Sie eine neue Skriptdatei (ersetzen Sie sie create_dir.shdurch Ihren gewünschten Skriptnamen):

    vim ~/create_dir.sh
    

    Das Skript wird im Home-Verzeichnis des Benutzers erstellt

  2. Fügen Sie einige Befehle , die nur ein rootoder sudoBenutzer wie das Erstellen eines Ordners auf der Stammverzeichnisebene ausführen kann:

    mkdir /abc
    

    Hinweis: Fügen Sie sudodiese Befehle nicht hinzu . Speichern und beenden (mit :wq!)

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

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

    1. Öffnen Sie die sudoersDatei:

      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 ahmaddurch Ihren Benutzernamen. Stellen Sie außerdem sicher, dass dies die letzte Zeile ist. Speichern und schließen.

  5. Wenn Sie den Befehl ausführen, fügen sudoSie Folgendes hinzu:

    sudo ./create_dir.sh
    

    Dadurch werden die Befehle in der Skriptdatei ausgeführt, ohne dass Sie nach einem Kennwort gefragt werden.

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

M. Ahmad Zafar
quelle
Es wäre besser, wenn Sie die relevanten Schritte hier angeben und den Link als Backup für detailliertere Informationen verwenden. Auf diese Weise behält Ihre Antwort einen möglichen Wert, selbst wenn dieser Link nicht mehr gültig wäre.
Anthon
15
Dieser Rat ist unsicher. Der sudoTeil von sudo chmod u+x create_dir.shist unnötig, da der Benutzer (vermutlich) das Eigentum an seinem Heimatverzeichnis hat. Da der Benutzer schreiben kann, create_dir.shhaben Sie diesem Benutzer effektiv eine kostenlose Root-Shell gegeben.
Lekensteyn
1
@Lekensteyn Bedeutet auch, dass ein Programm als Benutzer ausgeführt wird. Könnte dem Benutzer auch erlauben, irgendetwas mit sudo ohne Passwort auszuführen.
Pydsigner
2
Vermisse ich etwas? Ich glaube, dass das Ganze chmodunnötig ist, da Sie sich sudodarauf verlassen, Ihre Privilegien zu erhöhen.
G-Man
10

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

myusername ALL=(ALL) NOPASSWD: /path/to/executable
musik
quelle
6
Das (ALL)Teil ist optional, das Weglassen hat genau den gleichen Effekt. Wäre (root)besser gewesen, aber seine Abwesenheit erklärt das Problem nicht.
Gilles
+1 für sudo für diesen Befehl und sonst nichts! Kein Grund, das gesamte System zu brechen ...
Johan
3
@Johan: Das war schon in der Frage.
Gilles
5

Wenn Sie nicht sudo verwenden oder die Konfigurationsdatei von sudo ändern 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.

linuxgnuru
quelle
Wow, ich vorher noch nie von dieser Lösung gehört, umwerfend
somethingSomething
Warum muss ich in diesen Dingen nach unten scrollen, um die beste Antwort zu finden? Vielen Dank für diese einfache und sichere Lösung.
RyanNerd
5

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, besteht in den Root-Rechten. Sie können dieses Verzeichnis nicht ohne diese Berechtigung auflisten. Diese Datei ist Manjaro-spezifisch. Möglicherweise finden Sie diese Konfiguration unter einem anderen Namen, 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 Ignorieren Sie die Authentifizierung einer ausführbaren Datei für einen bestimmten Benutzer

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

KURZANMERKUNG: Sie öffnen eine Tür, um SUDO ohne Authentifizierung zu verwenden. Dies bedeutet, dass Sie alles ausführen können, indem Sie alles von Ihrem System aus ändern und verantwortungsbewusst verwenden.

Lyoneel
quelle
4

Stellen Sie sicher, dass sudo keinen Alias ​​hat. Laufen Sie so

/usr/bin/sudo /path/to/my/program

Zum Beispiel ein Shell-Alias ​​wie dieses:

alias sudo="sudo env PATH=$PATH"

kann dieses Verhalten verursachen.

Sepero
quelle
Du hast recht, mein Kommentar war nicht in Ordnung hier , sorry dafür. Trotzdem bin ich fasziniert - wie erwarten Sie, dass Aliasing die Verarbeitung sudoersdurch sudo verändert ? Oder reden Sie über die Umleitung sudozu etwas, das immer diese Fehlermeldung ausgibt, um Passwörter zu scoopen? Das ist hier unwahrscheinlich ...
Peterph
2
Ich hatte das gleiche Problem wie das OP. Es stellte sich heraus, dass alias sudo="sudo env PATH=$PATH"in meinem verursacht wurde ~/.bashrc. Anstatt es für mich selbst zu lösen und blindlings mein Geschäft zu betreiben, reichte ich meine Antwort als mögliche Lösung für alle anderen ein, die an diesem Thread teilnehmen.
Sepero
1
Das ist in Ordnung, aber wenn es nicht offensichtlich ist (was in diesem Fall zumindest für einige Leute nicht der Fall ist), ist es gut, eine Erklärung in die Antwort einzufügen, um einen Kontext bereitzustellen und Menschen daran zu hindern, blind magische Beschwörungsformeln zu verwenden. +2 (- (- 1) + +1). :)
Peterph
2

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

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

Sie können auch gtk-sudoeine visuelle Passwortabfrage in Betracht ziehen .

Sie sollten sich wahrscheinlich überlegen, dass Sie nicht als Root arbeiten sollten und das Ändern des Systems in einem späteren Stadium, sodass Sie überhaupt keine Root-Berechtigungen benötigen, ein besserer Weg wäre.

Caleb
quelle
7
Machen Sie keine Shell-Skripte setuid . Siehe setuid in Shell-Skripten zulassen .
Gilles
Ich habe darüber nachgedacht, es nicht einmal zu erwähnen, weil es eine so schlechte Option ist. Ich habe es gerade gelöscht, weil ich befürchte, dieser Fragesteller könnte den Rat auch mit der Warnung verwenden, dass es ein schlechter Rat war!
Caleb
2

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

Das Skript, das ich aufrief, befand sich in /usr/bineinem Verzeichnis, in das ich keine Schreibrechte habe (obwohl ich dort normalerweise alle Dateien lesen kann). Das Skript war chmodded + x (ausführbare Rechte), aber es funktionierte immer noch nicht. Nachdem ich diese Datei in einen Pfad in meinem Home-Verzeichnis verschoben habe /usr/bin, konnte ich sie endlich mit sudo aufrufen, ohne ein Passwort einzugeben.

Auch etwas, woran ich zweifelte (Klärung für zukünftige Leser): Sie müssen Ihr Skript als sudo ausführen. Typ sudobeim Aufruf des Skripts. Verwenden Sie diese Option nicht sudofür den Befehl in Ihrem Skript, für den Root erforderlich ist (in meinem Fall wird die Hintergrundbeleuchtung der Tastatur geändert). Vielleicht funktioniert das auch, aber das brauchen Sie nicht und es scheint eine bessere Lösung zu sein, dies nicht zu tun.

Luc
quelle
Der zweite Absatz hatte die Antwort auf mein Problem
M. Ahmad Zafar
@ MuhammadAhmadZafar Froh, dass es geholfen hat!
Luc
4
Tatsächlich ist die Verwendung sudoinnerhalb eines Skripts völlig in Ordnung, vorausgesetzt, Sie verfügen über die entsprechenden (festgelegten sudoers) Rechte , um den betreffenden Befehl ohne Kennwort auszuführen. Es macht die Dinge ein bisschen sicherer.
Peterph
könnte diese Antwort wirklich als eine schrittweise Neufassung von "So machst du das" verwenden, anstatt als Dialog mit den anderen Antworten
Walross the Cat
@ WalrustheCat Guter Punkt. Als ich meine Antwort noch einmal las, war ich vielleicht selbst ein bisschen verwirrt. Im Moment kann ich mich jedoch nicht an die genaue Situation erinnern, sodass ich nicht wirklich besser schreiben kann. Wenn Sie es herausfinden, vielleicht eine Kombination aus mehreren Antworten, senden Sie auf jeden Fall eine neue Antwort!
Luc
1

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

super /path/to/your/script

Wenn Sie eine ausführbare Binärdatei ausführen möchten (z. B. die Sie aus einem C-Quellcode, der kein Skript ist , in ELF- Binärdatei kompiliert haben ) , sollten Sie in Betracht ziehen, diese als setuid (und tatsächlich , und und verwenden alle diese Technik) zu definieren ). Seien Sie jedoch sehr vorsichtig, Sie könnten eine riesige Sicherheitslücke öffnen ./bin/login/usr/bin/sudo/bin/susuper

Konkret sollte Ihr Programm paranoisch codiert sein (prüfen Sie alle Argumente und die Umgebung sowie die äußeren Bedingungen, bevor Sie "handeln", wobei Sie einen potenziell feindlichen Benutzer annehmen). Dann können Sie seteuid (2) und friends (siehe auch setreuid (2) ) sorgfältig verwenden (Siehe auch Funktionen (7) & Anmeldeinformationen (7) & Ausführen (2) ...)

Sie werden chmod u+s(read chmod (1) ) verwenden, wenn Sie eine solche Binärdatei installieren.

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 anderes verrücktes Objekt nicht festgelegt werden kann. Aber Sie könnten (in C) eine kleine setuid-binary schreiben, die sie umschließt.

Basile Starynkevitch
quelle
0

Wenn Sie die Befehle anpassen, über die sudoSie sie ausführen können, sollten Sie diese Änderungen im Idealfall in einer separaten Datei unter vornehmen, /etc/sudoers.d/anstatt die sudoersDatei direkt zu bearbeiten . Sie sollten auch immer verwenden visudo, um die Datei (en) zu bearbeiten. Sie sollten sich nicht gewähren NOPASSWDauf ALLBefehle.

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

Geben Sie Ihre Zeilenberechtigung ein: myuser ALL= NOPASSWD: /path/to/your/program

Speichern und visudobeenden Sie dann und Sie werden gewarnt, wenn Sie Syntaxfehler haben.

Sie können ausführen sudo -l, um die Berechtigungen anzuzeigen, die Ihrem Benutzer erteilt wurden. Wenn einer der benutzerspezifischen NOPASSWDBefehle VOR einem %groupyouarein ALL=(ALL) ALLBefehl in der Ausgabe angezeigt wird, werden Sie zur Eingabe Ihres Kennworts aufgefordert.

Wenn Sie feststellen, dass Sie viele dieser sudoers.d-Dateien erstellen, möchten Sie sie möglicherweise nach Benutzer benannt erstellen, damit sie einfacher zu visualisieren sind. Beachten Sie, dass die Reihenfolge der DATEINAMEN und der REGELN in der Datei sehr wichtig ist. Die zuletzt geladene Datei gewinnt, unabhängig davon, ob MEHR oder WENIGER als die vorherigen Einträge zulässig ist.

Sie können die Reihenfolge der Dateinamen steuern, indem Sie ein Präfix von 00-99 oder aa / bb / cc verwenden. Beachten Sie jedoch auch, dass Dateien, die kein numerisches Präfix haben, nach den nummerierten Dateien geladen werden Einstellungen. Dies liegt daran, dass abhängig von Ihren Spracheinstellungen die "lexikalische Sortierung", die die Shell verwendet, zuerst Zahlen sortiert und dann bei der Sortierung in "aufsteigender" Reihenfolge Groß- und Kleinbuchstaben verschachtelt.

Versuchen Sie es mit printf '%s\n' {{0..99},{A-Z},{a-z}} | sortund, um printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortzu sehen, ob Ihre aktuelle Sprache gedruckt wird AaBbCcusw., oder ermitteln Sie ABCdann abc, welches das beste Präfix für den "letzten" Buchstaben ist.

dragon788
quelle
0

Um jedem Benutzer zu erlauben, das Programm als sudo auszuführen, 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 schafft .

Ultimatex
quelle
Dies ist zwar eine Möglichkeit, eine Sudo-Regel zu erstellen, sie beantwortet jedoch nicht die Frage, warum das Setzen des NOPASSWD-Flags für diese Regel immer noch zu einer Kennwortabfrage führte. In der akzeptierten Antwort finden Sie eine Idee, warum dies passiert ist.
Jeff Schaller
0

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 option1ohne Folgendes zu command option2verwenden:

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

aber wenn die Struktur command option1 value1, wo value1variieren 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.

  1. Erstellen Sie ein Shell-Skript, in dem Sie den Befehl ohne aufrufen sudo.
  2. 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. ).
  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 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 pmsetviele 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 sudoersDatei 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 
Koit Saarevet
quelle