在 Linux 上重启后保留 dhcpd.leases 上的文件权限

在 Linux 上重启后保留 dhcpd.leases 上的文件权限

我们有一台 Linux 机器,我们在其上运行 .NET Core 应用程序。此应用程序是一个 Web UI,用于显示和配置 EEPROM 系统。该应用程序读取位于目录 /var/lib/dh​​cp 中的 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,文件权限将成功更改。此服务在启动时正常运行,但在启用时则无法正常运行,尽管日志显示它已成功运行。

我尝试了这里和其他 Exchange 网站上发布的各种问题中的提示,但都没有奏效,所以我想分享我的具体情况。我们如何才能永久更改文件权限,以便在系统重新启动时不会恢复它们?

答案1

我们对 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 是用户的名称。该应用程序以用户 whisker 的身份运行,因此现在该应用程序能够读取和写入 dhcpd.leases 文件,这正是我们想要的。根据。据我们了解,具有默认权限的 dhcpd.leases~ 文件会不时覆盖 dhcpd.leases 文件,包括我们设置的权限。可以通过更改目录的所有者来消除此行为。因此,当系统重新启动时,文件的所有者不会恢复。

相关内容