Назад | Перейти на главную страницу

Как программно добавить secure_path в файл sudoers

Я пытаюсь создать сценарий пользовательских данных для экземпляра EC2, который создает node и npm из github, а затем запускает службу. Чтобы смазать эти колеса, мне нужно добавить:

:/usr/local/bin

до конца строки в / etc / sudoers, которая начинается:

Defaults        secure_path="

https://superuser.com/questions/927512/how-to-set-path-for-sudo-commands говорит об использовании visudo для достижения этой цели, но я хочу сделать это программно в пользовательских данных EC2.

https://stackoverflow.com/questions/16282789/adding-sudo-permissions-to-sudoers-for-user-via-shell-script говорит о редактировании файла sudoers, но кажется ужасно запеченным для того, чего я пытаюсь достичь.

Я думал, что будет легко найти строку и заменить ее, но я в тупике. Не только из-за надоедливой закрывающей кавычки!

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

Просто создайте там файл с полным secure_path стоимость:

Defaults secure_path="<default value>:/usr/local/bin"

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

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

предполагая, что вы знаете, что строка с secure_path существует, простая команда sed для этого

sed -i -e '/secure_path/ s[=.*[&:/usr/local/bin[' /etc/sudoers

или немного более сложный (дополнительная проверка синтаксиса на входе):

sed -i -r -e '/^\s*Defaults\s+secure_path/ s[=(.*)[=\1:/usr/local/bin[' /etc/sudoers