it-swarm.com.de

Verwenden Sie Sudo ohne Passwort in einem Skript

Aus irgendeinem Grund muss ich als Benutzer ohne Skript ein Skript script.sh ausführen, das root-Rechte benötigt, um funktionieren zu können.
Ich sah die einzige Lösung für Sudo INSIDE script.sh. Nehmen wir ein Beispiel:

script.sh :

#!/bin/sh
Sudo apt-get update

Wenn ich dieses Skript ausführte, bekomme ich natürlich eine Aufforderung, nach einem Kennwort zu fragen. Dann fügte ich meiner Sudoers-Datei hinzu (am Ende, um alles andere zu überschreiben):

user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh

Ich habe übrigens auch die Zeile ausprobiert:

user ALL=(ALL) NOPASSWD:/path/to/script.sh

(Ich glaube, ich habe den Unterschied nicht ganz verstanden) 

Aber das löst mein Problem nicht, wenn ich Sudo nicht zur Ausführung dieses Skripts benutze:

# ./script.sh
[Sudo] password for user: 
# Sudo ./script.sh
Starts updating...

Nun, ich sage mir "Ok, das heißt, wenn ich eine Datei in sudoers wie ich verwiesen habe, funktioniert das ohne Prompt nur, wenn ich ihn mit Sudo anrufe, was ist nicht das, was ich will".
Also, ok, ich erstelle ein Skript script2.sh wie folgt:

script2.sh

#!/bin/sh
Sudo /path/to/script.sh

In der Tat funktioniert es. Ich bin jedoch mit dieser Lösung nicht wirklich zufrieden, insbesondere mit der Tatsache, dass ich für jeden Befehl 2 Skripts verwenden muss. 

Dieser Beitrag ist dann gedacht, um Menschen zu helfen, die dieses Problem haben und nach der gleichen Lösung suchen (ich habe keinen guten Beitrag dazu gefunden), und vielleicht haben Sie bessere Lösungen von Ihnen. 

Fühlen Sie sich frei, Ihre Ideen zu teilen!


EDIT 1:

Ich möchte darauf bestehen, dass dieses "apt-get Update" nur ein Beispiel dafür ist, was mein Skript eigentlich ist. Mein Skript hat viele Befehle (mit einigen CD-Dateien für root-access-only-Konfigurationsdateien), und die Lösung kann nicht lauten: "Nun, machen Sie es einfach direkt mit apt-get".

Das Prinzip eines Beispiels besteht darin, zum Verständnis beizutragen, nicht als Entschuldigung, um die Antwort auf das allgemeine Problem zu vereinfachen.

27
Nilexys

Wenn Sie Sudo /usr/bin/apt-get update ohne Kennwort ausführen möchten, benötigen Sie den sudoers-Eintrag:

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

Für die umfassendere Ausgabe des gesamten Skripts gibt es zwei mögliche Ansätze:

Ansatz 1

Erstellen Sie für jeden Befehl im Skript, der Sudo benötigt, eine Zeile in sudoers speziell für diesen Befehl. In diesem Fall kann das Skript normal aufgerufen werden:

./script1.sh

Ansatz 2

Platzieren Sie eine Zeile in sudoers für das Skript als Ganzes. Wenn dies erledigt ist, benötigen die einzelnen Befehle keine Sudo. Zum Starten des Skripts muss jedoch Sudo verwendet werden:

Sudo ./script.sh
16
John1024

Aus meinem Blog: IDMRockstar.com :

Der Kicker ist, dass ich manchmal als root Befehle ausführen muss. Dies ist der schnelle und schmutzige Weg, auf dem ich dies ohne Angabe der Passwörter verwirklichen kann:

#! /bin/bash
read -s -p "Enter Password for Sudo: " sudoPW
echo $sudoPW | Sudo -S yum update

Auf diese Weise wird der Benutzer zur Eingabe des Kennworts aufgefordert (und vom Terminal ausgeblendet) und dann nach Bedarf in Befehle übergeben, sodass ich das gesamte Skript nicht als root ausführen kann.

Wenn Sie einen besseren Weg haben, würde ich es gerne hören! Ich bin kein Experte für Shell-Skripte.

Prost!

.: Adam

7
Adam

Wenn Ihr Passwort nicht besonders sicher ist (möglicherweise einige Testserver in der Firma usw.), können Sie das Skript per Echo auf Sudo übertragen:

echo YourPasswordHere | Sudo -S Command

Die Aufforderung gibt jedoch weiterhin den Text "Kennwort eingeben" aus, der jedoch ausgegeben werden soll. Erwarten Sie also nicht, dass es ordentlich ist.

Siehe diese Askubuntu post

7
Eaton Emmerich

Wie Sie bereits erwähnt haben, muss die Datei, die in der sudoers-Konfiguration angezeigt werden muss, von Sudo gestartet werden und nicht von Sudo.

Das Gesagte, was wir oft tun, ist so etwas zu haben 

user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh

in der Sudo-Konfiguration enthält script.sh alle Befehle, die das Skript ausführen muss.

Dann definieren wir entweder eine Bash-Funktion oder einen Alias, sodass script.sh tatsächlich ist 

Sudo /path/to/script.sh

Das einzige Problem ist, wenn einige Befehle nicht als root ausgeführt werden müssen, müssen Sie einige su - user -c "command"-Befehle in das Skript einfügen.

5
damienfrancois

Ich schlage vor, Sie schauen sich die Sudo-Umgebungsvariablen an - speziell können Sie $ Sudo_USER verwenden (und nach ihnen suchen). Rufen Sie Ihr Skript mit Sudo (1 Eintrag in Sudoers) auf, und führen Sie dann als Sudo_USER und root als root aus.

2
bryn

Um Befehle als root auszuführen, müssen Sie einfach su verwenden (selbst Sudo verwendet su) Solange Sie Sudo ./script2.sh erfolgreich ausführen, wird stattdessen Folgendes verwendet: Sudo su "#" // befiehlt hier als root "#" exit//commands als Verwendung hier Sie können es mit dem Namen Sudo zu einer Shell-Funktion machen, aber keine andere bessere Art, denke ich, jedoch ist es bei Skripten inti, rc Android .. etc muss aufgeräumt sein;)

sie müssen jedoch NOPASSWD angeben, um sicher zu sein, dass es absolut sicher ist

irgendwie fehlt hier einfach das POISX-Berechtigungsprinzip, das so filtert, dass nicht für alle Benutzer etwas aktiviert wird. Oder umgekehrt Rufen Sie Sudo so oft an, wie Sie möchten.

chown root script.sh
chmod 0755 script.sh
chgrp Sudo script.sh

"Root-Besitzer von .sh machen" "Schreibgeschützt machen und für andere ausführen" "und in die Sudo-Gruppe" natürlich unter Sudo das ist es

1
Youssef

Fügen Sie in der neuen Datei /etc/sudoers.d/apt-get eine Zeile ein:

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

Hier ist ein vollständig qualifizierter Pfad zur ausführbaren Datei erforderlich.

Verwenden Sie dann Folgendes in Ihrem Skript:

Sudo apt-get update

Hier ist kein vollständig angegebener Name erforderlich. Sudo verwendet die Umgebungsvariable PATH für die Auflösung von ausführbaren Dateien.

Achten Sie beim Ändern und Überprüfen der Sudoers-Konfiguration darauf, dass eine weitere Stammsitzung geöffnet ist, um die Fehler zu beheben.

0
Basilevs