微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 Linux 上重新启动后保留 dhcpd.leases 的文件权限

我们有一台运行 .NET Core 应用的 Linux 机器。此应用程序是一个 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 时,文件权限将成功更改。尽管日志显示它已成功运行,但该服务在启动时可以正常工作,但在启用时却无法正常工作。我尝试了这里和其他交流网站上发布的各种问题的提示,但没有任何效果,所以我想我会分享我的具体情况。我们如何永久更改文件权限,以便在系统重新启动时它们不会被还原?

解决方法

我们对 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/dh​​cp 目录的所有者,而不仅仅是 dhcpd.leases 文件。据我们了解,默认权限的dhcpd.leases~文件会时不时的覆盖dhcpd.leases文件,包括我们设置的权限。可以通过更改目录的所有者来消除这种行为。因此,当系统重新启动时,文件的所有者不会恢复。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。