Jak edytować / etc / sudoers ze skryptu?

116

Muszę edytować /etc/sudoersze skryptu, aby dodawać / usuwać rzeczy z białych list.

Zakładając, że mam polecenie, które działałoby na normalnym pliku, jak mogę je zastosować /etc/sudoers?

Czy mogę go skopiować i zmodyfikować, a następnie visudowymienić oryginał na zmodyfikowaną kopię? Udostępniając własny skrypt w $EDITOR?

Czy mogę po prostu użyć tych samych zamków i cp?

Pytanie dotyczy bardziej potencjalnych problemów niż znalezienia czegoś, co działa.

Aleksander
źródło

Odpowiedzi:

146

Stary wątek, ale co z:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
Beckerr
źródło
10
To świetna odpowiedź. Cała podpowłoka powinna być wykonana jako root, np echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
simon
3
Ta odpowiedź działa świetnie! Używam go do skriptów postinst w pakietach Debiana. dzięki! Ponieważ jest to zawsze root, staje się krótki i przydatny:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen
3
Chcę tylko zwrócić uwagę na główny niuans w odpowiedzi @ BorisDäppen: -aflaga do EDITOR="tee": doda linię do pliku, a nie tylko nadpisze pierwszą linię. Na początku nie złapałem tego innego i nie mogłem wymyślić sposobu na dodanie. Mam nadzieję, że znajdę trochę czasu, wskazując to bezpośrednio ;-)
Jean-Philippe Murray
3
Czy ktoś może mi wyjaśnić, jak to działa, mam na myśli, że nie jest wymagany średnik po EDITOR = 'tee -a'. Wiem, że to złamie polecenie. EDITOR to zmienna powłoki, a visudo to kolejne polecenie, więc tutaj przekazujemy EDITOR i visudo w tej samej linii poleceń. jak to naprawdę działa?
Sagar
1
Próbowałem tego x = "coś" echo $ x. To mi nie pomogło.
Sagar
43

Użyj do tego visudo z niestandardowym edytorem. To rozwiązuje wszystkie warunki wyścigu i problemy z „hakowaniem” za pomocą rozwiązania Briana.

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

Ten skrypt doda wiersz „# Dummy change to sudoers” na końcu sudoers. Bez hacków i warunków wyścigu.

Wersja z adnotacjami, która wyjaśnia, jak to faktycznie działa:

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
źródło
5
Wymaga to, aby sudo zostało skompilowane --enable-env-editor, w przeciwnym razie użyje tylko zmiennej edytora, jeśli jest to jedna z małego zestawu znanych wartości.
Caleb,
U mnie działa (Ubuntu 12.04), ale nie rozumiem, jak to działa. Czy ktoś mógłby wyjaśnić, jak prawidłowo go używać i jak to faktycznie działa? Dzięki
MountainX
Chciałbym zauważyć, że to nie działa dla mnie w dniu 12.04 dokładnie. Utworzyłem skrypt basha, dodałem do niego uprawnienia + x i wykonałem plik z następującym wyjściem: visudo: nie można uruchomić / tmp / edit_sudoers: błąd formatu Exec visudo: /etc/sudoers.tmp niezmieniony
Jose Diaz-Gonzalez
To zadziałało świetnie, chociaż po prostu zalogowałem się jako root i usunąłem sudo -Ez pierwszego polecenia.
merlin2011
Bardzo podoba mi się ta odpowiedź, ale nie zadziałała. Myślę, że moje sudo nie zostało skompilowane z wymaganą flagą.
Mnebuerquo
30

Powinieneś dokonać edycji w pliku tymczasowym, a następnie użyć visudo -c -f sudoers.temp, aby potwierdzić, że zmiany są prawidłowe, a następnie skopiować je na górę / 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
Brian C. Lane
źródło
Wygląda na to, że używasz sudoers.tmp jako pliku blokady, nie jestem pewien, jak to potwierdza, że ​​zmiany są prawidłowe. Czy nie powinniśmy sprawdzać statusu wyjścia visudo, aby upewnić się, że nie ma błędów?
konwerter42
/etc/sudoers.tmp to plik blokujący sprawdzany przez visudo w trybie interaktywnym. visudo -c -f zwraca 1, jeśli wystąpił błąd, stąd sprawdzenie kodu powrotu.
Brian C. Lane
Martwię się o użycie sudoers.tmp, ponieważ wygląda to na użycie wewnętrznego interfejsu visudo, tj. Włamanie. Czy jest to standardowe, co oznacza, że ​​zawsze jest to sudoers.tmp, który jest używany jako blokada? A może mają swobodę zmiany tego w przyszłości?
n-alexander
2
trzeba użyć pliku blokującego zamiast testu / dotyku
n-alexander
2
Strona podręcznika mówi, że używa /tmp/sudoers.tmp, więc jest to obecnie standard. Oczywiście może się to zmienić w przyszłości. I tak, masz rację, są warunki wyścigu.
Brian C. Lane
18

W Debianie i jego pochodnych możesz wstawić własny skrypt do /etc/sudoers.d/katalogu z prawami 0440- więcej informacji znajdziesz w /etc/sudoers.d/README .

To może pomóc.

pevik
źródło
Czy nie jest to jednak skomentowane?
2
@TomDworzanski: IMHO no. Zobacz man sudoers (5) i inne komentarze .
pevik
Masz rację! Dzięki za linki i świetną odpowiedź.
3
Używam tego katalogu również w Centos 7
Alexander Bird
Myślę, że to właściwy sposób.
jansohn
11

visudo ma być ludzkim interfejsem do edycji /etc/sudoers. Możesz osiągnąć to samo, zastępując plik bezpośrednio, ale musisz zadbać o jednoczesną edycję i sprawdzanie poprawności składni. Uważaj na r--r-----uprawnienia.

ngn
źródło
9

Jeśli zezwalasz na sudododawanie wpisów /etc/sudoers.d, możesz użyć tej odpowiedzi @ dragon788:

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

Zasadniczo używasz visudodo weryfikacji pliku przed skopiowaniem go /etc/sudoers.d, więc możesz mieć pewność, że nie złamiesz sudodla nikogo.

visudo -c -q -f filename

To, że sukces i powroty (0), czy to ważne, więc można go używać z kontroli if, &&i innych operacji skrypt logiczne. Po sprawdzeniu poprawności po prostu skopiuj go do programu /etc/sudoers.di powinno działać. Upewnij się, że należy do roota i nie ma prawa do zapisu przez innych.

Mnebuerquo
źródło
5

Skonfiguruj edytor niestandardowy. Zasadniczo będzie to skrypt, który zaakceptuje nazwę pliku (w tym przypadku /etc/sudoers.tmp) i zmodyfikuje ją i zapisze na miejscu. Możesz więc po prostu napisać do tego pliku. Kiedy skończysz, zamknij skrypt, a visudo zajmie się modyfikacją rzeczywistego pliku sudoers.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo
Ali Afshar
źródło
Czy mam rację, że wszystko, co musi zawierać dummy_editor.sh, jest takie? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Wydaje mi się, że to działa.
MountainX
4

Wiele odpowiedzi, pracowałem z sudo od lat, ale do tej pory nie musiałem automatyzować konfiguracji konfiguracji. Użyłem mieszanki niektórych z powyższych odpowiedzi, pisząc moją linię konfiguracyjną w /etc/sudoers.d zawierającą lokalizację, więc nie muszę modyfikować głównego pliku sudoers, a następnie sprawdziłem ten plik pod kątem składni, prosty przykład poniżej:

Napisz swoją linię do dołączonego pliku sudoers:

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

Sprawdź, czy plik dołączany do sudoers przeszedł testy składni visudo:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
Im-Kirk-Dougla-Cus
źródło
Po prostu pomiń gwiazdkę, której nie powinno tam być ^^
Sonata
it i zwraca sukces (0) - dostałem
Oleg
2

Aby dodać kolejną opcję do powyższych odpowiedzi, jeśli stan wyścigu nie jest poważnym problemem, można użyć następującego polecenia, aby uniknąć ręcznego kopiowania zmodyfikowanego pliku do /etc/sudoers

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

Zapewni to poprawność nowego pliku i poprawną instalację wraz z aktualizacją uprawnień.

Zwróć uwagę, że jeśli w /tmp/sudoers.newpliku jest błąd, visudozostanie wyświetlony monit o wprowadzenie danych przez użytkownika, dlatego zaleca się visudo -c -f /tmp/sudoers.newnajpierw to sprawdzić .

zelanix
źródło
1

Myślę, że najprostszym rozwiązaniem jest:

Utwórz skrypt addedudoers.sh

#!/bin/sh

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

i nazwij to z użytkownikami, których chcesz dodać jako:

root prompt> ./addsudoers.sh user1 user2

Aby uzyskać pełne wyjaśnienie, zobacz odpowiedź: Dodawanie użytkowników do sudoers za pomocą skryptu powłoki

Pozdrowienia!

Albert Vonpupp
źródło
0

Spróbuj to powtórzyć. Musisz jednak uruchomić go w podpowłoce. Przykład:

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

Apollo
źródło
-2

To zadziałało dla mnie na podstawie tego, co inni tutaj opublikowali. Kiedy użyłem skryptu innych ludzi, otworzyło się dla mnie visudo, ale nie dokonało edycji. To spowodowało edycję, której potrzebowałem, aby umożliwić wszystkim użytkownikom, w tym zwykłym użytkownikom, zainstalowanie java 7u17 dla 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

To dodało% everybody bla bla bla na końcu pliku sudoers. Musiałem uruchomić skrypt w ten sposób.

sudo sh sudoersedit.sh

Powodzenia: D.

Kamal
źródło