Является ли «эхо» оскорблениями по умолчанию «>> / etc / sudoers 'safe?

Это безопасно?

echo "Defaults insults" >> /etc/sudoers 

Если да, могу ли я это сделать?

 echo "## First line" >> /etc/sudoers echo "### Second line" >> /etc/sudoers echo "Defaults insults" >> /etc/sudoers echo "### Totally the last line" >> /etc/sudoers 

Есть ли лучший способ сделать это с помощью visudo ?

Я создаю скрипт bash, этот бит должен включать и выключать оскорбления.

2 Solutions collect form web for “Является ли «эхо» оскорблениями по умолчанию «>> / etc / sudoers 'safe?”

Есть как минимум 3 способа, которыми это может быть опасно:

  1. Если /etc/sudoers не заканчивается символом новой строки (например, sudo и visudo ), если он заканчивается в строке #includedir /etc/sudoers.d , ваша команда сделает это:

     #includedir /etc/sudoers.dDefaults insults 

    который сломает его и сделает sudo непригодным для использования.

  2. echo может не написать полную строку, например, если файловая система заполнена. Например, он может просто записывать значения по Defaults in . Что снова сломает ваш файл sudoers .
  3. На машине с несколькими админами, если одновременно пытаться изменить /etc/sudoers , данные, которые они пишут, могут быть чересстрочными.

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

visudo также защищает от нескольких лиц, редактирующих файлы sudoers одновременно.

Теперь, надежно используя visudo в автоматическом режиме, также сложно. Есть несколько проблем с этим:

  • Вы можете указать команду редактора visudo с переменной среды VISUAL (имеет приоритет над EDITOR ), но только если параметр env_editor не был отключен.
  • моя версия visudo по крайней мере, при некоторых условиях редактирует все /etc/sudoers и все файлы, в которые она входит (запускает $VISUAL для всех). Поэтому вы должны убедиться, что ваш $VISUAL только изменяет /etc/sudoers .
  • как видно выше, он не проверяет статус выхода редактора. Поэтому вам нужно убедиться, что файл, который сохраняет ваш редактор, либо успешно написан, либо вообще не изменен.
  • Он запрашивает пользователя в случае возникновения проблемы.

Обращаться ко всем этим немного сложно. Вот как вы могли это сделать:

 NEW_TEXT='Defaults insults' \ CODE=' if [ "$2" = /etc/sudoers.tmp ]; then printf >&2 "Editing %s\n" "$2" umask 077 { cat /etc/sudoers.tmp && printf "\n%s\n" "$NEW_TEXT" } > /etc/sudoers.tmp.tmp && mv -f /etc/sudoers.tmp.tmp /etc/sudoers.tmp else printf >&2 "Skipping %s\n" "$2" fi' \ VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null 

Не работает, если env_editor не установлен.

В системе GNU лучшей альтернативой будет использование sed -i который должен оставить sudoers.tmp немодифицированным, если он не сможет написать более новую версию:

Добавить insults :

 SED_CODE=' /^[[:blank:]]*Defaults.*insults/,${ /^[[:blank:]]*Default/s/!*\(insults\)/\1/g $q } $a\Defaults insults' \ CODE=' if [ "$2" = /etc/sudoers.tmp ]; then printf >&2 "Editing %s\n" "$2" sed -i -- "$SED_CODE" "$2" else printf >&2 "Skipping %s\n" "$2" fi' \ VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null По SED_CODE=' /^[[:blank:]]*Defaults.*insults/,${ /^[[:blank:]]*Default/s/!*\(insults\)/\1/g $q } $a\Defaults insults' \ CODE=' if [ "$2" = /etc/sudoers.tmp ]; then printf >&2 "Editing %s\n" "$2" sed -i -- "$SED_CODE" "$2" else printf >&2 "Skipping %s\n" "$2" fi' \ VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null По SED_CODE=' /^[[:blank:]]*Defaults.*insults/,${ /^[[:blank:]]*Default/s/!*\(insults\)/\1/g $q } $a\Defaults insults' \ CODE=' if [ "$2" = /etc/sudoers.tmp ]; then printf >&2 "Editing %s\n" "$2" sed -i -- "$SED_CODE" "$2" else printf >&2 "Skipping %s\n" "$2" fi' \ VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null 

Удалите оскорбления:

 SED_CODE=' /^[[:blank:]]*Defaults.*insults/,${ /^[[:blank:]]*Defaults/s/!*\(insults\)/!\1/g $q } $a\Defaults !insults' \ CODE=' if [ "$2" = /etc/sudoers.tmp ]; then printf >&2 "Editing %s\n" "$2" sed -i -- "$SED_CODE" "$2" else printf >&2 "Skipping %s\n" "$2" fi' \ VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null По SED_CODE=' /^[[:blank:]]*Defaults.*insults/,${ /^[[:blank:]]*Defaults/s/!*\(insults\)/!\1/g $q } $a\Defaults !insults' \ CODE=' if [ "$2" = /etc/sudoers.tmp ]; then printf >&2 "Editing %s\n" "$2" sed -i -- "$SED_CODE" "$2" else printf >&2 "Skipping %s\n" "$2" fi' \ VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null 

Я немного пошутил и, кажется, includedir поддержка доступна в sudo возвращаясь длинный путь (~ 2001 из того, что я могу сказать), поэтому его нужно поддерживать в RHEL 5. Ищите директиву include в ваших sudoers:

 sudo grep '#includedir' /etc/sudoers 

Если вы получаете результат, то в идеале вы должны добавлять и удалять файлы в этом каталоге, и обычно это /etc/sudoers.d . Этот путь может быть трудно определить в сценарии оболочки.

Во всяком случае, предполагая sudoers.d , вы должны добавить файлы с разрешениями не более 0600 в этом каталоге. Что-то вроде:

 umask 0177 echo 'Defaults insults' > /tmp/insults && sudo sh -c 'cp /tmp/insults /etc/sudoers.d; visudo -cf /etc/sudoers.d/insults 

|| rm /etc/sudoers.d/insults '

Затем удаление настройки выполняется так же просто, как:

 sudo rm /etc/sudoers.d/insults 

Вы можете использовать tee -a как EDITOR :

 $ sudo VISUAL='tee -a' visudo <<<"Defaults insults" Defaults insults $ sudo tail /etc/sudoers # Members of the admin group may gain root privileges %admin ALL=(ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d Defaults insults 

Я не знаю, includedir поддержка sudo в sudo , но если это так, то создайте в нем новые файлы с visudo -f , пожалуйста.

  • sudoers: NOPASSWD в той же строке, что и PASSWD: ALL?
  • Ошибка: / etc / sudoers не работают - Собственность неверна
  • Как я могу исправить ошибку sudo-sudo: parse в файле /etc/sudoers.d/ADSM рядом с строкой 5?
  • Судо жалуется, что «не находится в файле sudoers»
  • Могу ли я настроить сообщение sudo «этот инцидент будет сообщен»?
  • Введите пароль в команде sudo
  • как рассказать vi, чтобы не открывать всех включенных юдеров?
  • Как я могу добавить разрешение sudo для копирования?
  • У пользователя все еще есть привилегии sudo, несмотря на то, что они удалены из всех групп
  • Неизвестный параметр Флаг при работе с sudo
  • Каков наилучший способ добавить пользователя в группу sudoer?
  • Linux и Unix - лучшая ОС в мире.