PHP 执行 sed shell 命令

PHP execute sed shell command

我正在尝试通过 PHP 执行 sed shell 命令来更改文件中的某些字符串。 该文件位于 /etc/text.txt,我尝试使用以下代码修改该文件中的一些文本:

$old_path = getcwd();
chdir('/etc/');
$cmd = "sed -i 's/footext/newtext/g' text.txt";
exec($cmd);
chdir($old_path);

但是 text.txt 处的文本 'footext' 没有改变。

请帮我解决这个问题

谢谢

首先,我想重申允许您的 (public) 网络服务器更改系统文件的固有危险。这样做 导致攻击者破坏您的系统,这只是需要多少时间的问题。

也就是说,您的代码存在一些问题。第一个是依赖外部第三方 (shell) 命令,因为某些事情可以而且应该在纯 PHP 中完成。
毕竟,编辑文本是 PHP 的主要优势之一,而且代码会非常简单。举个例子...

if (!$content = file_get_contents ($filename)) {
    // Handle errors opening/reading the file here.
}

// Assuming case-sensitive search and replace here, as per the `sed` used.
$content = str_replace ("old text", "new text", $content);

if (!file_put_contents ($filename, $content)) {
    // Handle errors with writing to the file here.
}

这样做的主要好处是您不需要依赖不相关的第三方程序(尽管 sed 非常普遍)。这使得代码更容易理解、独立,因此与平台无关(在最大可能的范围内)。

至于为什么你的代码不起作用,我也怀疑这与文件权限有关。如评论中所述,默认情况下 www-data 用户无权写入 /etc/ 文件夹。因此,为了使其能够在那里编辑文件,您首先需要使用启用 root 的用户创建文件,然后将所有权更改为 www-data.
但是,在任何情况下都不要 对该文件夹中已经存在的文件执行此操作。意外和灾难性副作用的可能性太大了!

如果您确实需要 PHP 脚本修改系统文件,请编写 shell 脚本并通过 crontab 或类似的方式调用它。 之后,您已 100% 确定输入 100% 不会被滥用。 (IE:仅可打印字符,最好是 ASCII。)