Как мне отредактировать / etc / sudoers из скрипта? - PullRequest
98 голосов
/ 27 ноября 2008

Мне нужно отредактировать /etc/sudoers из скрипта, чтобы добавить / удалить материал из белых списков.

Если у меня есть команда, которая будет работать с обычным файлом, как я могу применить ее к /etc/sudoers?

Могу ли я скопировать и изменить его, а затем visudo заменить оригинал измененной копией? Предоставляя свой собственный скрипт в $EDITOR?

Или я могу просто использовать те же замки и cp?

Вопрос больше о потенциальных проблемах, чем о том, чтобы найти что-то, что работает.

Ответы [ 12 ]

117 голосов
/ 07 февраля 2015

Старая тема, а как же:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
42 голосов
/ 14 сентября 2010

Используйте Visudo для этого с пользовательским редактором. Это решает все условия гонки и проблемы со взломом с помощью решения Брайана.

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

Этот скрипт добавит строку "# Dummy change to sudoers" в конец sudoers. Нет хаков и нет условий гонки.

Аннотированная версия, которая объясняет, как это на самом деле работает:

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
29 голосов
/ 27 ноября 2008

Вы должны внести изменения во временный файл, затем использовать visudo -c -f sudoers.temp, чтобы подтвердить, что изменения действительны, а затем скопировать его поверх / 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
13 голосов
/ 31 июля 2013

В Debian и его производных вы можете вставить собственный скрипт в каталог /etc/sudoers.d/ с правами 0440 & ndash; для получения дополнительной информации см. / etc / sudoers.d / README .

Это может помочь.

8 голосов
/ 27 ноября 2008

visudo - это человеческий интерфейс для редактирования /etc/sudoers. Вы можете добиться того же, заменив файл напрямую, но вы должны позаботиться о параллельном редактировании и проверке синтаксиса. Следите за разрешениями r--r-----.

6 голосов
/ 22 апреля 2016

Если ваш sudo позволяет добавлять записи в /etc/sudoers.d, то вы можете использовать этот ответ по @ dragon788:

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

Обычно вы используете visudo для проверки файла перед тем, как скопировать его в /etc/sudoers.d, так что вы можете быть уверены, что не нарушаете sudo ни для кого.

visudo -c -q -f filename

Это проверяет его и возвращает success (0), если оно допустимо, поэтому вы можете использовать его с if, && и другими логическими операциями скрипта. Как только вы подтвердите, просто скопируйте его в /etc/sudoers.d, и он должен работать. Убедитесь, что он принадлежит пользователю root и не доступен для записи другим пользователям.

5 голосов
/ 27 ноября 2008

Настройка собственного редактора. По сути, это будет скрипт, который принимает имя файла (в данном случае /etc/sudoers.tmp), а также изменяет и сохраняет его на месте. Так что вы можете просто записать в этот файл. Когда вы закончите, выйдите из скрипта, и visudo позаботится об изменении файла sudoers.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo
3 голосов
/ 22 января 2019

Множество ответов, я работал с sudo для yonks, но до сих пор не нуждался в автоматизации конфигурации установки. Я использовал смесь из нескольких ответов выше, записав свою строку конфигурации в /etc/sudoers.d include location, чтобы мне не нужно было изменять основной файл sudoers, затем проверил этот файл на синтаксис, простой пример ниже: 1001 *

Напишите вашу строку в файл sudoers include:

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

Убедитесь, что ваш файл sudoers прошел проверку синтаксиса visudo:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
2 голосов
/ 29 мая 2013

Просто чтобы добавить дополнительную опцию к ответам выше, если условие гонки не является серьезной проблемой, тогда можно использовать следующую команду, чтобы избежать ручного копирования измененного файла в /etc/sudoers

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

Это обеспечит проверку и правильность установки нового файла с обновлением разрешений.

Обратите внимание, что если в файле /tmp/sudoers.new есть ошибка, visudo запросит ввод данных пользователем, поэтому рекомендуется сначала проверить его с помощью visudo -c -f /tmp/sudoers.new.

1 голос
/ 07 марта 2014

Я думаю, что самое простое решение - это:

Создать скрипт addudoers.sh

#!/bin/sh

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

и позвоните пользователям, которым хотите добавить:

root prompt> ./addsudoers.sh user1 user2

Полное объяснение см. В этом ответе: Добавление пользователей в sudoers с помощью сценария оболочки

Привет!

...