如何以编程方式在 sudoers 文件中添加 secure_path

如何以编程方式在 sudoers 文件中添加 secure_path

我正在尝试为 EC2 实例构建一个用户数据脚本,该脚本从 github 构建节点和 npm,然后启动服务。为了顺利完成这项工作,我需要添加:

:/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 文件,但对于我想要实现的目标来说,这似乎太过分了。

我以为 grep 该行并替换它很容易,但我却不知所措。不仅仅是因为那个烦人的结束引号!

答案1

如果您可以接受替换secure_path值而不是附加值,则可以使用更简单的解决方案。通常 sudo 有一个 config 目录,/etc/sudoers.d您可以在其中放置其他配置文件。

只需在那里创建一个包含完整值的文件secure_path

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

这将覆盖主配置中的值。如果所有机器的路径值都相同,则可以使用脚本或包轻松部署。

这样做还有一个额外的好处,那就是当将来更新 sudo 包时,您不必检查并可能合并配置文件。

答案2

假设你知道有 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

答案3

最近(或许从那时起),你就可以添加如下一行:

Defaults secure_path += ":/usr/local/bin"

相关内容