![如何以编程方式在 sudoers 文件中添加 secure_path](https://linux22.com/image/694273/%E5%A6%82%E4%BD%95%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E5%9C%A8%20sudoers%20%E6%96%87%E4%BB%B6%E4%B8%AD%E6%B7%BB%E5%8A%A0%20secure_path.png)
我正在尝试为 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"