在 Linux 重新启动后保留对 dhcpd.leases 的文件权限

Keep file permissions on dhcpd.leases after reboot on Linux

我们有一台 Linux 机器,我们在上面 运行 我们的 .NET Core 应用程序。此应用程序是一个 Web UI,用于显示和配置 EEPROM 系统。 该应用程序读取位于目录 /var/lib/dhcp 中的 dhcpd.leases 文件,并在 UI.

中显示每个 EEPROM 的 IP 地址

当一个新的 EEPROM 添加到系统时,它的 IP 地址被添加到 dhcpd.leases 文件中,因此它显示在 UI 中。但是,当从系统中删除 EEPROM 时,其 IP 地址不会从 dhcpd.leases 文件中删除,因此它会继续显示在 UI.

我们希望允许用户在 EEPROM 从系统中物理删除后能够从 UI 中删除它。

当用户从 UI 中删除 EEPROM 时,我们希望将其 IP 地址从 dhcpd.leases 中删除,这样它就不会再次显示。

这是不可能的,因为文件的默认权限只给所有者读写权限(没有列出所有者),给dhcpd组和其他用户只读权限,不要不要让它被执行。通过 运行 命令 sudo chmod 777 /var/lib/dhcp/dhcpd.leases,可以更改文件权限,因此应用程序可以按照我们的意愿修改文件。但是,只要系统重新启动,文件权限就会恢复。我们的 Linux 机器使用 systemd 服务在系统启动时启动应用程序,因此我认为创建 systemd 服务将是确保在系统启动时执行更改文件权限的命令的最佳方式。我在目录 /etc/systemd/system 中创建了一个名为 dhcp.service 的文件,如下所示:

[Unit]  
Description=change dhcpd.leases permissions  

[Service]  
Type=oneshot  
WorkingDirectory=/var/lib/dhcp  
ExecStart=chmod 777 dhcpd.leases  
User=root  

[Install]  
WantedBy=multi-user.target

然后我运行命令systemctl enable dhcp.service。但即使在重新启动系统后,文件权限仍然没有改变。我 运行 命令 systemctl is-enabled dhcp.service 并返回启用。我也 运行 journalctl -u dhcp.service 并且日志显示系统启动时服务 运行 成功。当我运行systemctl start dhcp.service时,文件权限会成功更改。尽管日志显示它 运行 成功,但该服务在启动时会正常工作,但在启用时不会。我尝试了此处和其他交换站点上发布的各种问题的提示,但没有任何效果,所以我想我会分享我的具体情况。我们如何才能永久更改文件权限,以便在系统重新启动时它们不会恢复?

我们对 systemd 服务进行了更改:

[Unit]
Description=change dhcpd.leases permissions
After=isc-dhcp-server.service

[Service]
Type=oneshot
WorkingDirectory=/var/lib/dhcp
ExecStartPre=/bin/sleep 30
ExecStart=chown -R whisker:whisker /var/lib/dhcp/
User=root

[Install]
WantedBy=multi-user.target

这与我们之前尝试的方法略有不同,但它是一种更好的方法。 chmod 777 是危险的,因为它使文件对每个人都可读、可写和可执行。该服务改为更改文件的所有者,其中 whisker 是用户名。该应用程序作为用户晶须运行,因此现在该应用程序能够读取和写入 dhcpd.leases 文件,这正是我们想要的。根据 this,必须更改整个 /var/lib/dhcp 目录的所有者,而不仅仅是 dhcpd.leases 文件。据我们了解,具有默认权限的 dhcpd.leases~ 文件会不时覆盖 dhcpd.leases 文件,包括我们设置的权限。可以通过更改目录的所有者来消除此行为。因此,当系统重新启动时,文件的所有者不会恢复。