Я пытаюсь создать сценарий пользовательских данных для экземпляра 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