我有一个应用程序,我希望能够更改 Linux 中的主机名。目前通过运行主机名命令来执行此操作。我也不想设置 CAP_SYS_ADMIN 。我也不想编辑 /etc/hostname 并重新启动。
是否有只允许更改主机名的功能?如果不是,我的选择是什么?
答案1
在 Linux 中设置主机名是通过 sethostname(2) 系统调用完成的。 /bin/hostname 是这个系统调用(以及一些相关的系统调用)的裸包装。 /etc/hostname 应该在引导过程中由某个脚本读取,随后运行 /bin/hostname 来完成其工作。
CAP_SYS_ADMIN 是 Linux 功能之一(7),允许线程执行各种各样的系统管理操作,包括设置主机名。我不知道能力框架内有更小的粒度。
然而还有其他选择。我们可以授予某些用户运行某些命令的能力作为另一个用户,通过 sudo(8),以可定制的方式。此示例 sudoers(5) 配置将允许用户 alice 以 root 身份运行 /bin/hostname。
alice ALL=(root:ALL) /bin/hostname
作为在这个超级用户问题中描述,第一个“ALL”可以替换为运行该命令的主机,除非在协作环境中,否则不使用。 “root”可以替换为“ALL”以允许 alice 运行任何用户。第二个“ALL”可以替换为组。
最后一个字段是允许 alice 运行的命令。由于 /bin/hostname 的使用有限,我想这没问题。否则我们可能会在它后面加上一个参数,这样alice就无法在没有这个参数的情况下运行命令,以限制权力。