Come modifico / etc / sudoers da uno script?


116

Devo modificare /etc/sudoersda uno script per aggiungere / rimuovere elementi dalle liste bianche.

Supponendo di avere un comando che funzionerebbe su un file normale, come potrei applicarlo /etc/sudoers?

Posso copiarlo e modificarlo, quindi visudosostituire l'originale con la copia modificata? Fornendo il mio script in $EDITOR?

O posso semplicemente usare le stesse serrature e cp?

La domanda riguarda più potenziali problemi che trovare qualcosa che funzioni.

Risposte:


146

Vecchio thread, ma per quanto riguarda:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo

10
Questa è un'ottima risposta. L'intera subshell dovrebbe essere eseguita come root, ad es echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
simon

3
Questa risposta funziona alla grande! Lo uso per gli script postinst nei pacchetti Debian. Grazie! Dato che è sempre root, diventa breve e pratico:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen

3
Voglio solo sottolineare una sfumatura importante alla risposta di @ BorisDäppen: il -aflag a EDITOR="tee": aggiungerà una riga al file, non solo sovrascriverà la prima riga. All'inizio non ho capito il diverso e non sono riuscito a capire come aggiungere. Spero di poter trovare alcune persone un po 'di tempo indicandolo direttamente ;-)
Jean-Philippe Murray

3
qualcuno può spiegarmi come questo lavoro, voglio dire, non è il punto e virgola richiesto dopo EDITOR = 'tee -a'. So che interromperà il comando. EDITOR è una variabile di shell e visudo è ancora un altro comando, quindi qui stiamo passando EDITOR e visudo nella stessa riga di comando. come funziona davvero?
Sagar

1
Ho provato questo x = "qualcosa" echo $ x. Questo non ha funzionato per me.
Sagar

43

Usa visudo per questo con un editor personalizzato. Questo risolve tutte le condizioni di gara e problemi di "hacking" con la soluzione di Brian.

#!/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

Questo script aggiungerà la riga "# Dummy change to sudoers" alla fine di sudoers. Nessun hack e nessuna condizione di gara.

Versione annotata che spiega come funziona effettivamente:

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

5
Ciò richiede che sudo sia stato compilato con --enable-env-editor, altrimenti userà il rispetto della variabile dell'editor solo se fa parte di un piccolo insieme di valori noti.
Caleb

Funziona per me (Ubuntu 12.04), ma non capisco come funziona. Qualcuno potrebbe spiegare come usarlo correttamente e come funziona effettivamente? Grazie
MountainX

Vorrei sottolineare che questo non sembra funzionare per me su 12.04 preciso. Ho creato uno script bash, aggiunto i permessi + x ad esso ed eseguito il file con il seguente output: visudo: impossibile eseguire / tmp / edit_sudoers: errore di formato Exec visudo: /etc/sudoers.tmp invariato
Jose Diaz-Gonzalez

Questo ha funzionato alla grande per me, anche se ho semplicemente effettuato l'accesso come root e ho rimosso il sudo -Edal primo comando.
merlin2011

Mi piace molto questa risposta, ma non ha funzionato per me. Penso che il mio sudo non sia stato compilato con il flag necessario.
Mnebuerquo

30

Dovresti apportare le modifiche a un file temporaneo, quindi utilizzare visudo -c -f sudoers.temp per confermare che le modifiche sono valide e quindi copiarlo sopra / etc / sudoers

#!/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

Sembra che tu stia utilizzando sudoers.tmp come file di blocco, non sono sicuro di come confermi la validità delle modifiche. Non dovremmo controllare lo stato di uscita di visudo per assicurarci che non ci siano errori?
converter42

/etc/sudoers.tmp è il file di blocco controllato da visudo in modalità interattiva. visudo -c -f restituisce un 1 in caso di errore, da qui il controllo del codice di ritorno.
Brian C. Lane,

Sono preoccupato per l'utilizzo di sudoers.tmp, poiché sembra che si utilizzi l'interfaccia interna di visudo, ovvero un hack. È standard, il che significa che è garantito che sia sempre sudoers.tmp che viene utilizzato come blocco? O hanno la libertà di cambiare la situazione in futuro?
n-alexander

2
è necessario utilizzare il file di blocco invece di test / touch
n-alexander

2
La manpage dice che usa /tmp/sudoers.tmp, quindi questo è attualmente lo standard. Ovviamente potrebbe cambiare in futuro. E sì, hai ragione, c'è una condizione di gara.
Brian C. Lane,

18

Su Debian e sui suoi derivati, puoi inserire script personalizzati nella /etc/sudoers.d/directory, con diritti 0440- per maggiori informazioni vedi /etc/sudoers.d/README .

Potrebbe aiutare.


Non è però commentato?

2
@TomDworzanski: IMHO no. Vedi man sudoers (5) e altri commenti .
pevik

Hai ragione! Grazie per i link e l'ottima risposta.

3
Uso anche quella directory in centos 7
Alexander Bird

Penso che questo sia il modo giusto per farlo.
jansohn

11

visudo dovrebbe essere l'interfaccia umana per l'editing /etc/sudoers. Puoi ottenere lo stesso sostituendo il file direttamente, ma devi prenderti cura della modifica simultanea e della convalida della sintassi. Attenzione alle r--r-----autorizzazioni.


9

Se sudoconsenti l'aggiunta di voci /etc/sudoers.d, puoi utilizzare questa risposta di @ dragon788:

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

Fondamentalmente si utilizza visudoper verificare il file prima di copiarlo, in /etc/sudoers.dmodo da essere sicuri di non rompere sudoper nessuno.

visudo -c -q -f filename

Questo controlla e restituisce il successo (0) se è valido, per cui si può utilizzare con if, &&ed altre operazioni di script booleani. Una volta convalidato, copialo in /etc/sudoers.de dovrebbe funzionare. Assicurati che sia di proprietà di root e non sia scrivibile da altri.


5

Imposta un editor personalizzato. Fondamentalmente sarà uno script che accetta il nome del file (in questo caso /etc/sudoers.tmp), e lo modifica e lo salva sul posto. Quindi potresti semplicemente scrivere su quel file. Quando hai finito, esci dallo script e visudo si occuperà di modificare il file sudoers effettivo per te.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo

Ho corretto che tutto il necessario dummy_editor.sh contenga qualcosa del genere? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Sembra funzionare per me.
MountainX

4

Molte risposte, ho lavorato con sudo per yonks ma fino ad ora non avevo bisogno di automatizzare la configurazione di installazione. Ho usato un mix di alcune delle risposte sopra, scrivendo la mia riga di configurazione nella posizione /etc/sudoers.d include in modo da non dover modificare il file sudoers principale, quindi ho controllato la sintassi di quel file, semplice esempio di seguito:

Scrivi la tua linea in un file include sudoers:

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

Verifica che i tuoi sudoer includano il file superato i controlli di sintassi visudo:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file

Basta omettere l'asterisco, non dovrebbe essere lì ^^
Sonata

e restituisce successo (0) - capito
Oleg

2

Solo per aggiungere un'ulteriore opzione alle risposte sopra, se la condizione di competizione non è una delle principali preoccupazioni, è possibile utilizzare il comando seguente per evitare di copiare manualmente un file modificato in /etc/sudoers

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

Ciò garantirà che il nuovo file venga convalidato e installato correttamente con l'aggiornamento delle autorizzazioni.

Si noti che se c'è un errore nel /tmp/sudoers.newfile, visudoverrà richiesto l'input dell'utente, quindi è consigliabile controllarlo visudo -c -f /tmp/sudoers.newprima con .


1

Penso che la soluzione più semplice sia:

Crea uno scriptAddudoers.sh

#!/bin/sh

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

e chiamalo con gli utenti a cui vuoi aggiungerlo come:

root prompt> ./addsudoers.sh user1 user2

Per la spiegazione completa vedere questa risposta: Aggiunta di utenti a sudoer tramite script di shell

Saluti!


0

Prova a farlo eco. Tuttavia, devi eseguirlo in una subshell. Esempio:

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


-2

Questo ha funzionato per me in base a ciò che altri hanno pubblicato qui. Quando ho usato lo script di altre persone, si apriva visudo per me ma non apportava la modifica. Ciò ha reso la modifica necessaria per consentire a tutti gli utenti, inclusi gli utenti standard, di installare java 7u17 per safari / firefox.

#!/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

Questo ha aggiunto% everyone blah blah blah in fondo al file sudoers. Ho dovuto eseguire lo script in questo modo.

sudo sh sudoersedit.sh

Buona fortuna: D

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.