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