Как редактировать /etc/sudoers из script?

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

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

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

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

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

Ответ 1

Старый поток, но как насчет:

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

Ответ 2

Используйте 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

Этот script добавит строку "# 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

Ответ 3

Вы должны внести свои изменения во временный файл, затем используйте 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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Если ваш 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 и не доступен для записи другим пользователям.

Ответ 8

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

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

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

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

Ответ 9

Я думаю, что самым простым решением является:

Создайте скрипт 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 с помощью сценария оболочки

С уважением!

Ответ 10

Попробуйте повторить его. Однако вы должны запустить его в подоболочке. Пример:

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

Ответ 11

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

Напишите свою строку в файл включения sudoers:

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

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

sudo visudo -c f/etc/sudoers.d/99_sudo_include_file

Ответ 12

Это сработало для меня, основываясь на том, что другие разместили здесь. Когда я использовал другие народы script, он открыл бы visudo для меня, но не сделал бы редактирование. Это сделало редактирование, которое я должен был разрешить всем пользователям, включая стандартных пользователей, установить java 7u17 для 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

Это добавило% all blah blah blah к нижней части файла sudoers. Мне пришлось запустить script следующим образом.

sudo sh sudoersedit.sh

Удачи: D