Wie bearbeite ich / etc / sudoers aus einem Skript?

116

Ich muss /etc/sudoersein Skript bearbeiten , um Inhalte zu weißen Listen hinzuzufügen oder daraus zu entfernen.

Angenommen, ich habe einen Befehl, der für eine normale Datei funktioniert, wie könnte ich ihn anwenden /etc/sudoers?

Kann ich es kopieren und ändern und dann visudodas Original durch die geänderte Kopie ersetzen lassen? Durch die Bereitstellung meines eigenen Skripts in $EDITOR?

Oder kann ich einfach die gleichen Schlösser verwenden und cp?

Bei der Frage geht es mehr um potenzielle Probleme als nur darum, etwas zu finden, das funktioniert.

n-Alexander
quelle

Antworten:

146

Alter Thread, aber was ist mit:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
Beckerr
quelle
10
Dies ist eine großartige Antwort. Die gesamte Subshell sollte als Root ausgeführt werden, z echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
Simon
3
Diese Antwort funktioniert super! Ich benutze es für Postinst-Skripts in Debian-Paketen. Vielen Dank! Da dies immer root ist, wird es kurz und praktisch:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen
3
Ich möchte nur auf eine wichtige Nuance der Antwort von @ BorisDäppen hinweisen: das -aFlag an EDITOR="tee": Es wird eine Zeile an die Datei anhängen und nicht nur die erste Zeile überschreiben. Ich habe den Unterschied zuerst nicht verstanden und konnte mir nicht vorstellen, wie ich ihn anhängen soll. Ich hoffe, ich kann einige Leute einige Zeit finden, indem ich das direkt zeige ;-)
Jean-Philippe Murray
3
Kann mir jemand erklären, dass diese Arbeit nicht das Semikolon ist, das nach EDITOR = 'tee -a' erforderlich ist? Ich weiß, dass das den Befehl brechen wird. EDITOR ist eine Shell-Variable und visudo ist ein weiterer Befehl. Hier übergeben wir EDITOR und visudo in derselben Befehlszeile. Wie funktioniert das wirklich?
Sagar
1
Ich habe versucht, dieses x = "etwas" Echo $ x. Das hat bei mir nicht funktioniert.
Sagar
43

Verwenden Sie dazu visudo mit einem benutzerdefinierten Editor. Dies löst alle Rennbedingungen und "Hack" -Probleme mit Brians Lösung.

#!/bin/sh
if [ -z "$1" ]; then
  echo "Starting up visudo with this script as first parameter"
  export EDITOR=$0 && sudo -E visudo
else
  echo "Changing sudoers"
  echo "# Dummy change to sudoers" >> $1
fi

Dieses Skript fügt die Zeile "# Dummy change to sudoers" am Ende von sudoers hinzu. Keine Hacks und keine Rennbedingungen.

Kommentierte Version, die erklärt, wie dies tatsächlich funktioniert:

if [ -z "$1" ]; then

  # When you run the script, you will run this block since $1 is empty.

  echo "Starting up visudo with this script as first parameter"

  # We first set this script as the EDITOR and then starts visudo.
  # Visudo will now start and use THIS SCRIPT as its editor
  export EDITOR=$0 && sudo -E visudo
else

  # When visudo starts this script, it will provide the name of the sudoers 
  # file as the first parameter and $1 will be non-empty. Because of that, 
  # visudo will run this block.

  echo "Changing sudoers"

  # We change the sudoers file and then exit  
  echo "# Dummy change to sudoers" >> $1
fi
sstendal
quelle
5
Dies setzt voraus, dass sudo mit kompiliert --enable-env-editorwurde. Andernfalls wird die Editorvariable nur dann verwendet, wenn es sich um einen kleinen Satz bekannter Werte handelt.
Caleb
Es funktioniert für mich (Ubuntu 12.04), aber ich verstehe nicht, wie es funktioniert. Könnte jemand erklären, wie man es richtig benutzt und wie es tatsächlich funktioniert? Vielen Dank
MountainX
Ich möchte darauf hinweisen, dass dies für mich am 12.04. Genau nicht zu funktionieren scheint. Ich habe ein Bash-Skript erstellt, + x Berechtigungen hinzugefügt und die Datei mit der folgenden Ausgabe ausgeführt: visudo: / tmp / edit_sudoers kann nicht ausgeführt werden: Formatfehler ausführen visudo: /etc/sudoers.tmp unverändert
Jose Diaz-Gonzalez
Dies funktionierte hervorragend für mich, obwohl ich mich einfach als root angemeldet und den sudo -Eaus dem ersten Befehl entfernt habe.
Merlin2011
Ich mag diese Antwort wirklich, aber sie hat bei mir nicht funktioniert. Ich denke, mein Sudo wurde nicht mit der notwendigen Flagge kompiliert.
Mnebuerquo
30

Sie sollten Ihre Änderungen an einer temporären Datei vornehmen und dann visudo -c -f sudoers.temp verwenden, um zu bestätigen, dass die Änderungen gültig sind, und sie dann über / etc / sudoers kopieren

#!/bin/sh
if [ -f "/etc/sudoers.tmp" ]; then
    exit 1
fi
touch /etc/sudoers.tmp
edit_sudoers /tmp/sudoers.new
visudo -c -f /tmp/sudoers.new
if [ "$?" -eq "0" ]; then
    cp /tmp/sudoers.new /etc/sudoers
fi
rm /etc/sudoers.tmp
Brian C. Lane
quelle
Es sieht so aus, als würden Sie sudoers.tmp als Sperrdatei verwenden. Sie sind sich nicht sicher, wie dies bestätigt, dass Änderungen gültig sind. Sollten wir nicht den Exit-Status von visudo überprüfen, um sicherzustellen, dass keine Fehler vorliegen?
Konverter42
/etc/sudoers.tmp ist die von visudo im interaktiven Modus überprüfte Sperrdatei. visudo -c -f gibt eine 1 zurück, wenn ein Fehler aufgetreten ist, daher die Überprüfung des Rückkehrcodes.
Brian C. Lane
Ich mache mir Sorgen um die Verwendung von sudoers.tmp, da es so aussieht, als würde man die interne Schnittstelle von visudo verwenden, dh einen Hack. Ist es Standard, was bedeutet, dass garantiert immer sudoers.tmp als Sperre verwendet wird? Oder haben sie die Freiheit, dies in Zukunft zu ändern?
n-Alexander
2
Müssen Lockfile anstelle von Test / Touch verwenden
n-Alexander
2
Die Manpage sagt, dass es /tmp/sudoers.tmp verwendet, so dass dies derzeit der Standard ist. Natürlich könnte sich das in Zukunft ändern. Und ja, Sie haben Recht, es gibt eine Rennbedingung.
Brian C. Lane
18

Unter Debian und seinen Derivaten können Sie ein benutzerdefiniertes Skript /etc/sudoers.d/mit Rechten in ein Verzeichnis einfügen . 0440Weitere Informationen finden Sie unter /etc/sudoers.d/README .

Es könnte helfen.

pevik
quelle
Ist es nicht auskommentiert?
2
@ TomDworzanski: IMHO nein. Siehe man sudoers (5) und andere Kommentare .
Pevik
Du hast recht! Danke für die Links und tolle Antwort.
3
Ich benutze dieses Verzeichnis auch in Centos 7
Alexander Bird
Ich denke, das ist der richtige Weg.
jansohn
11

visudo soll die menschliche Schnittstelle für die Bearbeitung sein /etc/sudoers. Sie können dasselbe erreichen, indem Sie die Datei direkt ersetzen. Sie müssen sich jedoch um die gleichzeitige Bearbeitung und Syntaxüberprüfung kümmern. Beachten Sie die r--r-----Berechtigungen.

ngn
quelle
9

Wenn Sie das sudoHinzufügen von Einträgen /etc/sudoers.dzulassen, können Sie diese Antwort von @ dragon788 verwenden:

https://superuser.com/a/1027257/26022

Grundsätzlich visudoüberprüfen Sie die Datei, bevor Sie sie kopieren /etc/sudoers.d, damit Sie sicher sein können, dass Sie sudofür niemanden kaputt gehen .

visudo -c -q -f filename

Dies überprüft es und gibt Erfolg (0) zurück, wenn es gültig ist, so dass Sie es mit verwenden können if,&& und andere Script Boolesche Operationen. Sobald Sie validiert haben, kopieren Sie /etc/sudoers.des einfach in und es sollte funktionieren. Stellen Sie sicher, dass es Root gehört und nicht von anderen beschreibbar ist.

Mnebuerquo
quelle
5

Richten Sie einen benutzerdefinierten Editor ein. Grundsätzlich handelt es sich um ein Skript, das den Dateinamen (in diesem Fall /etc/sudoers.tmp) akzeptiert und diesen ändert und an Ort und Stelle speichert. Sie können also einfach in diese Datei schreiben. Wenn Sie fertig sind, beenden Sie das Skript, und visudo kümmert sich darum, die eigentliche sudoers-Datei für Sie zu ändern.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo
Ali Afshar
quelle
Stimmt es, dass alles, was dummy_editor.sh enthalten muss, so etwas ist? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Es scheint für mich zu funktionieren.
MountainX
4

Viele Antworten, habe mit sudo for yonks gearbeitet, musste aber bis jetzt die Setup-Konfiguration nicht automatisieren. Ich habe eine Mischung aus einigen der obigen Antworten verwendet und meine Konfigurationszeile in den Include-Speicherort /etc/sudoers.d geschrieben, damit ich die Haupt-Sudoers-Datei nicht ändern muss. Dann habe ich diese Datei auf Syntax überprüft. Ein einfaches Beispiel unten:

Schreiben Sie Ihre Zeile in eine Sudoers-Include-Datei:

sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'

Überprüfen Sie, ob Ihre Sudoer-Include-Datei die Visudo-Syntaxprüfungen bestanden hat:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
Im-Kirk-Dougla-Cus
quelle
Lass einfach das Sternchen weg, das sollte nicht da sein ^^
Sonata
es und gibt Erfolg zurück (0) - bekam es
Oleg
2

Nur um den obigen Antworten eine weitere Option hinzuzufügen: Wenn die Rennbedingung kein großes Problem darstellt, kann der folgende Befehl verwendet werden, um das manuelle Kopieren einer geänderten Datei in zu vermeiden /etc/sudoers

sudo EDITOR="cp /tmp/sudoers.new" visudo

Dadurch wird sichergestellt, dass die neue Datei mit dem Berechtigungsupdate überprüft und korrekt installiert wird.

Beachten Sie, dass bei einem Fehler in der /tmp/sudoers.newDatei visudoeine Benutzereingabe erforderlich ist. Es ist daher ratsam, diese visudo -c -f /tmp/sudoers.newzuerst zu überprüfen .

Zelanix
quelle
1

Ich denke, die einfachste Lösung ist:

Erstellen Sie ein Skript addsudoers.sh

#!/bin/sh

while [ -n "$1" ]; do
    echo "$1    ALL=(ALL:ALL) ALL" >> /etc/sudoers;
    shift # shift all parameters
done

und rufen Sie es mit den Benutzern auf, die Sie hinzufügen möchten, als:

root prompt> ./addsudoers.sh user1 user2

Die vollständige Erklärung finden Sie in dieser Antwort: Hinzufügen von Benutzern zu Sudoern über ein Shell-Skript

Grüße!

Albert Vonpupp
quelle
0

Versuchen Sie es zu wiederholen. Sie müssen es jedoch in einer Subshell ausführen. Beispiel:

sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"

Apollo
quelle
-2

Dies funktionierte für mich basierend auf dem, was andere hier gepostet haben. Wenn ich das Skript anderer Leute verwendete, öffnete es visudo für mich, machte aber keine Bearbeitung. Dies machte die Bearbeitung, die ich brauchte, um allen Benutzern, einschließlich Standardbenutzern, die Installation von Java 7u17 für Safari / Firefox zu ermöglichen.

#!/usr/bin/env bash
rm /etc/sudoers.new
cp /etc/sudoers /etc/sudoers.new
echo "%everyone   ALL = NOPASSWD: /usr/sbin/installer -pkg /Volumes/Java 7 Update 17/Java 7 Update 17.pkg -target /" >> /etc/sudoers.new
cp /etc/sudoers.new /etc/sudoers

Dies fügte die% every bla bla bla am Ende der Sudoers-Datei hinzu. Ich musste das Skript so ausführen.

sudo sh sudoersedit.sh

Viel Glück: D.

Kamal
quelle