在 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 时,我们希望从 dhcpd.leases 中删除它的 IP 地址,这样它就不会再次显示。这是不可能的,因为文件的默认权限只给予所有者读写权限(没有列出所有者),给予 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,文件权限将成功更改。此服务在启动时正常工作,但在启用时却无法工作,尽管日志显示它已成功运行。我尝试了这里和其他交换网站上发布的各种问题中的提示,但都没有起作用,所以我想分享我的具体情况。我们如何永久更改文件权限,以便系统重新启动时不会恢复它们?

答案1

您的问题可能是用于运行 dhcp 的用户:该文件的所有者是,root:root但 dhcpd 可能以 的身份运行dhcpd:dhcpd。如果是这样

/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid

可以改为

/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user root -group root --no-pid

匹配 的所有者:组/var/lib/dhcp


如果不是:比 chmod 777 更好的方法是将所有权更改为/var/lib/dhcpd用户dhcpd。因此sudo chown -R dhcpd:dhcpd /var/lib/dhcp每次在守护进程启动后。

如果是这个问题的话我也会认为这是一个错误。编辑:红帽已于 2012 年修复。


同样重要的是:手动的指出文件已被自动清理。

为了防止租约数据库无限制增长,该文件会不时重写。首先,创建一个临时租约数据库,并将所有已知租约转储到其中。然后,将旧租约数据库重命名/var/lib/dhcpd/dhcpd.leases~。最后,将新写入的租约数据库移至原位

会议有一个租赁时间:

default-lease-time 600;
max-lease-time 7200;

降低这些值可能会更快地解决您的问题。


我们如何才能永久地改变文件权限,以便系统重启时它们不会恢复?

这不是重新启动;而是守护进程的启动。

答案2

我们对 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 文件,包括我们设置的权限。可以通过更改目录的所有者来消除此行为。因此,当系统重新启动时,文件的所有者不会恢复。

相关内容