Ich muss etwas als sudo ohne Passwort ausführen, also habe ich Folgendes verwendet visudo
und 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 mit einem Benutzer ohne Rootberechtigung als root ausführen / verwenden, ohne nach einem Passwort zu fragen?
/path/to/my/program
ein Python-Skript wäre?.bashrc
) gesetzt ist? Oder sogar ein Shell-Skript/usr/local/sbin
? Ausprobieren./etc
, aber einige Systeme setzen es woanders. Wenn Sie es nicht finden können, versuchen Sie esman sudoers
. Der lokale Speicherort für diese Datei sollte in dieman
Seite eingesetzt werden,sudo
als sie für dieses System erstellt wurde.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.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_reset
in/etc/sudoers
oder dass diese Option ist die Kompilierung-Standard (sudo sudo -V | grep env
sollte enthaltenReset the environment to a default set of variables
).quelle
john ALL=(ALL) NOPASSWD: all
. Es hat keinen Sinn, über zu gehensu
.sudoers
müssen Sie nichts Besonderes tun:sudo
Überprüfen Sie es jedes Mal.WARNUNG : Diese Antwort wurde als unsicher eingestuft. Siehe Kommentare unten
Komplettlösung: Die folgenden Schritte helfen Ihnen, die gewünschte Ausgabe zu erzielen:
Erstellen Sie eine neue Skriptdatei (ersetzen Sie sie
create_dir.sh
durch Ihren gewünschten Skriptnamen):Das Skript wird im Home-Verzeichnis des Benutzers erstellt
Fügen Sie einige Befehle , die nur ein
root
odersudo
Benutzer wie das Erstellen eines Ordners auf der Stammverzeichnisebene ausführen kann:Hinweis: Fügen Sie
sudo
diese Befehle nicht hinzu . Speichern und beenden (mit:wq!
)Weisen Sie ihm Ausführungsberechtigungen zu, indem Sie Folgendes verwenden:
Nehmen Sie Änderungen vor, sodass für dieses Skript kein Kennwort erforderlich ist.
Öffnen Sie die
sudoers
Datei:Fügen Sie am Ende die folgende Zeile hinzu:
Ersetzen Sie
ahmad
durch Ihren Benutzernamen. Stellen Sie außerdem sicher, dass dies die letzte Zeile ist. Speichern und schließen.Wenn Sie den Befehl ausführen, fügen
sudo
Sie Folgendes hinzu: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/
quelle
sudo
Teil vonsudo chmod u+x create_dir.sh
ist unnötig, da der Benutzer (vermutlich) das Eigentum an seinem Heimatverzeichnis hat. Da der Benutzer schreiben kann,create_dir.sh
haben Sie diesem Benutzer effektiv eine kostenlose Root-Shell gegeben.chmod
unnötig ist, da Sie sichsudo
darauf verlassen, Ihre Privilegien zu erhöhen.Ich denke deine Syntax ist falsch. Zumindest benutze ich das Folgende, was für mich funktioniert:
quelle
(ALL)
Teil ist optional, das Weglassen hat genau den gleichen Effekt. Wäre(root)
besser gewesen, aber seine Abwesenheit erklärt das Problem nicht.Wenn Sie nicht sudo verwenden oder die Konfigurationsdatei von sudo ändern müssen, können Sie Folgendes verwenden:
Dadurch wird der Befehl als root ausgeführt, ohne dass sudo erforderlich ist.
quelle
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:
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
oder Authentifizierung für einen Benutzer ignorieren
oder Ignorieren Sie die Authentifizierung einer ausführbaren Datei für einen bestimmten Benutzer
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.
quelle
Stellen Sie sicher, dass sudo keinen Alias hat. Laufen Sie so
Zum Beispiel ein Shell-Alias wie dieses:
kann dieses Verhalten verursachen.
quelle
sudoers
durch sudo verändert ? Oder reden Sie über die Umleitungsudo
zu etwas, das immer diese Fehlermeldung ausgibt, um Passwörter zu scoopen? Das ist hier unwahrscheinlich ...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.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
.desktop
Datei erstellen , die Ihr Programm mit sudo ausführt, genau wie auf dem Terminal.Sie können auch
gtk-sudo
eine 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.
quelle
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/bin
einem 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
sudo
beim Aufruf des Skripts. Verwenden Sie diese Option nichtsudo
fü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.quelle
sudo
innerhalb eines Skripts völlig in Ordnung, vorausgesetzt, Sie verfügen über die entsprechenden (festgelegtensudoers
) Rechte , um den betreffenden Befehl ohne Kennwort auszuführen. Es macht die Dinge ein bisschen sicherer.Eine andere Möglichkeit könnte darin bestehen, das Skript zu installieren, zu konfigurieren und dann mit dem Befehl super auszuführen
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/su
super
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.
quelle
Wenn Sie die Befehle anpassen, über die
sudo
Sie sie ausführen können, sollten Sie diese Änderungen im Idealfall in einer separaten Datei unter vornehmen,/etc/sudoers.d/
anstatt diesudoers
Datei direkt zu bearbeiten . Sie sollten auch immer verwendenvisudo
, um die Datei (en) zu bearbeiten. Sie sollten sich nicht gewährenNOPASSWD
aufALL
Befehle.Beispiel:
sudo visudo -f /etc/sudoers.d/mynotriskycommand
Geben Sie Ihre Zeilenberechtigung ein:
myuser ALL= NOPASSWD: /path/to/your/program
Speichern und
visudo
beenden 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 benutzerspezifischenNOPASSWD
Befehle VOR einem%groupyouarein ALL=(ALL) ALL
Befehl 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.
Versuchen Sie es mit
printf '%s\n' {{0..99},{A-Z},{a-z}} | sort
und, umprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort
zu sehen, ob Ihre aktuelle Sprache gedruckt wirdAaBbCc
usw., oder ermitteln SieABC
dannabc
, welches das beste Präfix für den "letzten" Buchstaben ist.quelle
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 .
quelle
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 zucommand option2
verwenden:user_name ALL=(root) /usr/bin/command option1
aber wenn die Struktur
command option1 value1
, wovalue1
variieren kann, müßten Sie explizite sudoers Linien für jeden möglichen Wert habenvalue1
. 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.
sudo
./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 (zchmod 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
: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:
quelle