我试图通过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的文本“足下文字”并没有改变。
请帮我解决这个问题
谢谢
发布于 2016-10-13 07:42:10
首先,我想重申允许您的(公共)web服务器更改系统文件的内在危险。这样做会导致攻击者危及您的系统,这只是一个时间问题。
也就是说,您的代码有几个问题。第一种方法是依赖外部第三方(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/文件夹的权限。因此,为了使它能够在那里编辑文件,首先需要使用启用根的用户创建文件,然后将所有权更改为www-data。
但是,在任何情况下都不要对此文件夹中的现有文件执行此操作。潜在的意外和灾难性的副作用实在是太大了!
如果您绝对需要让PHP脚本修改系统文件,那么编写一个shell脚本并通过crontab或类似的方法调用它。在您100%确定输入是100%安全不受滥用之后。(即:只可打印字符,最好是ASCII。)
https://stackoverflow.com/questions/40014147
复制相似问题