我们有一台 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
我们对 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 很危险,因为它使每个人都可以读取、写入和执行该文件。该服务会更改文件的所有者,其中胡须是用户的名称。该应用程序作为用户胡须运行,因此现在该应用程序能够读取和写入 dhcpd.leases 文件,这正是我们想要的。必须更改整个 /var/lib/dhcp 目录的所有者,而不仅仅是 dhcpd.leases 文件的所有者,根据这。据我们了解,具有默认权限的dhcpd.leases~文件会时不时地覆盖dhcpd.leases文件,包括我们设置的权限。通过更改目录的所有者可以消除此行为。因此,当系统重新启动时,文件的所有者不会恢复。