Ответ 1
Старый поток, но как насчет:
echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
Мне нужно отредактировать /etc/sudoers
из скрипта, чтобы добавить/удалить материал из белых списков.
Предполагая, что у меня есть команда, которая будет работать с обычным файлом, как я могу применить ее к /etc/sudoers
?
Могу ли я скопировать и изменить его, а затем заменить visudo
оригинал на измененную копию? Предоставляя свой собственный скрипт в $EDITOR
?
Или я могу просто использовать те же замки и cp
?
Вопрос больше о потенциальных проблемах, чем о том, чтобы найти что-то, что работает.
Старый поток, но как насчет:
echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
Используйте 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
Вы должны внести свои изменения во временный файл, затем используйте 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
В Debian и его производных вы можете вставить пользовательский script в каталог /etc/sudoers.d/
с правами 0440
– для получения дополнительной информации см. /etc/sudoers.d/README.
Это может помочь.
visudo должен быть человеческим интерфейсом для редактирования /etc/sudoers
. Вы можете добиться того же, заменив файл напрямую, но вы должны заботиться о параллельном редактировании и синтаксической проверке. Обратите внимание на разрешения r--r-----
.
Настройте собственный редактор. В основном это будет script, который принимает имя файла (в данном случае /etc/sudoers.tmp) и изменяет и сохраняет его на месте. Таким образом, вы можете просто написать в этот файл. Когда вы закончите, выйдите из script, и visudo позаботится об изменении фактического файла sudoers для вас.
sudo EDITOR=/path/to/my_dummy_editor.sh visudo
Если ваш 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 и не доступен для записи другим пользователям.
Чтобы добавить дополнительную опцию к ответам выше, если условие гонки не является серьезной проблемой, тогда можно использовать следующую команду, чтобы избежать ручного копирования измененного файла на /etc/sudoers
sudo EDITOR="cp /tmp/sudoers.new" visudo
Это гарантирует, что новый файл будет проверен и установлен правильно с обновлением разрешений.
Обратите внимание, что если в файле /tmp/sudoers.new
есть ошибка, тогда visudo
будет запрашивать ввод пользователя, поэтому рекомендуется сначала проверить его с помощью visudo -c -f /tmp/sudoers.new
.
Я думаю, что самым простым решением является:
Создайте скрипт 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 с помощью сценария оболочки
С уважением!
Попробуйте повторить его. Однако вы должны запустить его в подоболочке. Пример:
sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"
Множество ответов, я работал с sudo для yonks, но до сих пор не нуждался в автоматизации конфигурации установки. Я использовал комбинацию некоторых из ответов выше, записав свою строку конфигурации в /etc/sudoers.d include location, чтобы мне не нужно было изменять основной файл sudoers, затем проверил этот файл на синтаксис, простой пример ниже:
sudo bash -c 'echo "your_user ALL = (ALL) NOPASSWD: ALL" >>/etc/sudoers.d/99_sudo_include_file'
sudo visudo -c f/etc/sudoers.d/99_sudo_include_file
Это сработало для меня, основываясь на том, что другие разместили здесь. Когда я использовал другие народы 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