LAN配置表单提交成功但无法更新/etc/network/interfaces文件求助
问题诊断与解决方案
1. 首要问题:表单提交目标错误
你的HTML表单指定的提交目标是nm.php,但实际处理配置更新的脚本是lanconf.php,导致表单提交后根本没有执行更新逻辑。
修正方法:修改表单的action属性为正确的脚本路径:
<form method="POST" action="lanconf.php">
2. 正则表达式匹配失效
原正则无法正确捕获接口的完整配置段,核心问题:
- 未启用DOTALL模式(
s修饰符),.默认不匹配换行符,导致.*?无法跨行读取接口配置内容 - 匹配范围错误,原模式仅覆盖
auto $selectedInterface到iface $selectedInterface之间的内容,无法完整覆盖整个接口的配置项
修正后的正则:
// 匹配从auto指令开始,到下一个auto指令或文件结尾的完整接口段 $pattern = "/auto $selectedInterface\s*(.*?)(?=\nauto|\z)/s";
正则说明:
\s*:匹配auto eth0后的任意空白字符(换行、空格)(.*?):非贪婪匹配所有内容(因s修饰符可跨换行)(?=\nauto|\z):正向预查,确保只匹配当前接口的配置段,不会影响其他接口
3. 添加错误处理逻辑
原代码未检查文件读写操作是否成功,即使操作失败仍会显示“保存成功”的提示,导致无法排查问题。
添加错误判断:
// 读取文件时检查 $content = file_get_contents($filename); if ($content === false) { die("无法读取配置文件,请检查权限"); } // 写入文件时检查 $result = file_put_contents($filename, $content); if ($result === false) { die("无法写入配置文件,请检查权限"); }
4. 最终修正后的lanconf.php代码
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 获取表单数据 $selectedInterface = $_POST['interface']; $ip = $_POST['ip_address']; $gateway = $_POST['gateway']; $dns = $_POST['dns_servers']; // 读取配置文件 $filename = '/etc/network/interfaces'; $content = file_get_contents($filename); if ($content === false) { die("无法读取配置文件,请检查文件权限"); } // 匹配目标接口的完整配置段 $pattern = "/auto $selectedInterface\s*(.*?)(?=\nauto|\z)/s"; // 生成新的配置内容 $newConfig = "auto $selectedInterface\n"; $newConfig .= "iface $selectedInterface inet static\n"; $newConfig .= " address $ip\n"; $newConfig .= " gateway $gateway\n"; $newConfig .= " dns-nameservers $dns\n"; // 替换旧配置 $content = preg_replace($pattern, $newConfig, $content); // 写入更新后的配置 $result = file_put_contents($filename, $content); if ($result === false) { die("无法写入配置文件,请检查文件权限"); } echo "Configuration for $selectedInterface has been updated."; echo '<div id="message" style="display: block; color: green;">Configuration saved successfully!</div>'; } else { echo "Please fill out the form and submit it."; } ?>
5. 权限确认(可选)
确保PHP运行用户(通常为www-data)对/etc/network/interfaces有写入权限:
sudo chown www-data:www-data /etc/network/interfaces sudo chmod u+w /etc/network/interfaces
内容的提问来源于stack exchange,提问作者Okuhle Ntloyiya
相关产品推荐
相关产品推荐

