Я хотел бы удалить строку из sudoers. Все работает хорошо, пока я даю точную линию. Но на некоторых машинах могут быть различия в пустом пространстве. Не удалось найти обходной путь даже с "соответствием".

file_line { '/etc/sudoers':
          ensure => absent,
          path   => '/etc/sudoers',
          line   => 'myuser  ALL=NOPASSWD:/bin/su -', }

Есть идеи? Спасибо Аки

3 ответа3

2

Я бы не использовал ensure => absent здесь, так как он позволяет только точное совпадение. Простой , но эффективный обходной путь будет использовать комментарий (или пустой) line вместе с match регулярное выражение для поиска замены:

file_line { 'sudoers-myuser':
          path   => '/etc/sudoers',
          line   => '# myuser  ALL=NOPASSWD:/bin/su -', 
          match  => 'myuser.*ALL=NOPASSWD:/bin/su.*-',
}

Это может привести к появлению line даже если match отсутствует в файле, но, поскольку содержимое запрещено, оно не должно представлять серьезных проблем. Будьте осторожны, чтобы избежать регулярных выражений специальных символов в строке match .

1

file_line - это нормально работающий ресурс для обеспечения появления строк в файле, но не очень хороший для гарантии того, что строк там нет - вот почему я полностью перестал его использовать.

Если вам действительно нужно управлять этим файлом по частям и вам нужно убедиться, что строка полностью удалена, ресурс augeas сделает это гораздо лучше. Это довольно сложно, но делает работу действительно хорошо. И уже должен быть объектив для файла sudoers.

Но Лорникс прав. Вы не должны управлять этим файлом таким образом. Он полон опасностей и здесь есть монстры.

Предпочитаю шаблоны и включаемые файлы.

Чтобы ответить на ваш вопрос явно: вы не можете. Один взгляд на исходный код file_line показывает, что он ищет только точное совпадение - пробел и все.

  def destroy
    local_lines = lines
    File.open(resource[:path],'w') do |fh|
      fh.write(local_lines.reject{|l| l.chomp == resource[:line] }.join(''))
    end
  end
0

Поместите информацию о пользователе в новый файл, поместите этот новый файл в /etc/sudoers.d

Смотрите man-страницу sudoers для более подробной информации. (В основном просто обратите внимание, что имя файла в /etc/sudoers.d не может содержать «~» или «a»).». Так что john_doe хорошо, а john.doe плохо)

Это полностью устранит ваши трудности, пытаясь точно сопоставить записи в файле. Многие сервисы имеют подкаталоги?.D, чтобы сделать это проще. (cron.d, sysctl.d, /etc/modprobe.d, ... и т. д.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .