Як редагувати / etc / sudoers зі сценарію?


116

Мені потрібно відредагувати /etc/sudoersсценарій, щоб додати / видалити речі з білих списків.

Якщо припустити, що я маю команду, яка працюватиме у звичайному файлі, як я можу застосувати її /etc/sudoers?

Чи можу я скопіювати та змінити її, а потім visudoзамінити оригінал модифікованою копією? Надаючи власний сценарій в $EDITOR?

Або я можу просто використовувати ті самі замки і cp?

Питання стосується скоріше потенційних проблем, ніж просто пошуку того, що працює.

Відповіді:


146

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

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

10
Це чудова відповідь. Весь підшалл повинен бути виконаний як корінь, наприклад echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
симон

3
Ця відповідь чудово працює! Я використовую його для скриптів постінст у пакунках debian. Дякую! Оскільки це завжди корінь, він стає коротким і зручним:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Борис Даппен

3
Я просто хочу вказати на головний нюанс у відповіді @ BorisDäppen: -aпрапор до EDITOR="tee": він додасть рядок до файлу, а не лише замінить перший рядок. Спочатку я не впіймав різних і не міг зрозуміти спосіб додавання. Я сподіваюся, що я можу знайти деяких людей, зазначивши це прямо ;-)
Жан-Філіп Мюррей

3
хтось може мені пояснити, як ця робота я маю на увазі, чи не крапка з комою, необхідною після EDITOR = 'tee -a'. Я знаю, що порушить команду. EDITOR - це змінна оболонка, а visudo - це ще одна команда, тому тут ми передаємо EDITOR і visudo в одному командному рядку. як це насправді працює?
Сагар

1
Я спробував це x = "щось" відлуння $ x. Це не спрацювало для мене.
Сагар

43

Використовуйте для цього візуально за допомогою спеціального редактора. Це вирішує всі умови перегонів і "зламає" проблеми з рішенням Брайана.

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

5
Для цього потрібен компільований sudo --enable-env-editor, інакше він використовуватиме відносну змінну редактора, лише якщо це одне з невеликого набору відомих значень.
Калеб

Це працює для мене (Ubuntu 12.04), але я не розумію, як це працює. Чи може хтось пояснити, як правильно ним користуватися і як він насправді працює? Спасибі
MountainX

Хочу зазначити, що, здається, це не працює для мене точно 12.04. Я створив Баш скрипт, додав + х дозволу до нього, і виконується файл з наступний висновок: visudo: не вдалося запустити / TMP / edit_sudoers: Exec помилка в форматі visudo: /etc/sudoers.tmp без змін
Хосе Діас-Гонсалес

Для мене це спрацювало чудово, хоча я просто увійшов як root і видалив sudo -Eпершу команду.
merlin2011

Мені дуже подобається ця відповідь, але це не спрацювало для мене. Я думаю, моє судо не було складено з необхідним прапором.
Mnebuerquo

30

Ви повинні внести свої зміни до тимчасового файлу, а потім використовувати 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

Схоже, ви використовуєте sudoers.tmp як файл блокування, не знаєте, наскільки це підтверджує зміни. Чи не слід перевіряти статус визуалу, щоб переконатися, що немає помилок?
конвертер42

/etc/sudoers.tmp - це файл блокування, який перевіряється visudo в інтерактивному режимі. visudo -c -f повертає 1, якщо сталася помилка, отже, перевірка коду повернення.
Брайан К. Лейн

Мене хвилює використання sudoers.tmp, оскільки це виглядає як використання внутрішнього інтерфейсу visudo, тобто хак. Це стандарт, це означає, що він гарантовано завжди буде sudoers.tmp, який використовується як замок? Або вони мають свободу змінити це в майбутньому?
n-alexander

2
потрібно використовувати lockfile замість тесту / touch
n-alexander

2
На сторінці вказується, що вона використовує /tmp/sudoers.tmp таким чином, що зараз є стандартом. Звичайно, це може змінитися в майбутньому. І так, ви маєте рацію, є умова гонки.
Брайан К. Лейн

18

У Debian та його похідних ви можете вставити користувальницький скрипт у /etc/sudoers.d/каталог із правами 0440- докладнішу інформацію див. /Etc/sudoers.d/README .

Це може допомогти.


Невже це не коментується?

2
@TomDworzanski: ІМХО немає. Дивіться чоловіки sudoers (5) та інші коментарі .
певік

Ти маєш рацію! Дякую за посилання та чудову відповідь.

3
Я також використовую цей каталог у centos 7 також
Олександр Птах

Я думаю, що це правильний спосіб зробити це.
Янсон

11

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


9

Якщо ви sudoдозволяєте додавати записи /etc/sudoers.d, ви можете використовувати цю відповідь за адресою @ dragon788:

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

В основному ви використовуєте visudoдля перевірки файлу перед тим, як скопіювати його /etc/sudoers.d, так що ви можете бути впевнені, що ви не зламаєте його sudoдля когось.

visudo -c -q -f filename

Це перевіряє його і повертає успіх (0), якщо він дійсний, тому ви можете ним користуватися if , &&і іншими операціями сценарію булеві. Після валідації просто скопіюйте її /etc/sudoers.dі вона повинна працювати. Переконайтеся, що він належить до root та не може бути доступний для друку.


5

Створіть спеціальний редактор. В основному це буде сценарій, який приймає ім'я файлу (в даному випадку /etc/sudoers.tmp), а також змінює та зберігає його на місці. Тож ви могли просто записати в цей файл. Коли ви закінчите, вийдіть із сценарію, і visudo подбає про зміну фактичного файлу sudoers для вас.

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

Чи я правда, що все, що потрібно містити dummy_editor.sh, - це щось подібне? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Здається, це працює для мене.
MountainX

4

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

Напишіть свій рядок на sudoers include file:

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

Переконайтеся, що ваші судори містять файл, який пройшов перевірку синтаксису візуо:

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

Просто опустіть зірочку, якої там не повинно бути ^^
Соната,

це і повертає успіх (0) - отримав
Олег

2

Просто, щоб додати додатковий варіант до відповідей вище, якщо умова перегонів не викликає особливих проблем, тоді можна використовувати наступну команду, щоб уникнути копіювання зміненого файлу вручну вручну. /etc/sudoers

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

Це дозволить перевірити та встановити новий файл правильно та встановлено з оновленнями дозволів.

Зауважте, що якщо у /tmp/sudoers.newфайлі є помилка, то visudoз’явиться запит на введення користувачем, тому бажано спочатку перевірити це visudo -c -f /tmp/sudoers.new.


1

Я думаю, що найбільш прямим рішенням є:

Створіть сценарій 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

Для повного пояснення дивіться цю відповідь: Додавання користувачів до судорів через скрипт оболонки

З повагою!


0

Спробуйте перегукувати це. Однак вам потрібно запустити його в передпласті. Приклад:

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


-2

Це працювало для мене на основі того, що тут розміщували інші. Коли я використав сценарій інших народів, він відкрив би візуальне для мене, але редагування не зробив. Це зробило потрібне мені редагування, щоб дозволити всім користувачам, включаючи стандартних користувачів, встановити 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

Це додало% усіх бла-бла-благ до нижньої частини файлу sudoers. Мені довелося запустити такий сценарій.

sudo sh sudoersedit.sh

Удачі: D

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.