【问题标题】:SED command to replace a complex PHP string at the beginning of an existing PHP fileSED 命令替换现有 PHP 文件开头的复杂 PHP 字符串
【发布时间】:2016-05-29 13:53:37
【问题描述】:

我决定在几个我看到攻击的基于 PHP 的网站上安装 ZB Block。所有网站都在 Ubuntu 14.04 LTS / Apache 2.4 / PHP 5.5.9 上运行

ZB Block 脚本调用需要插入到每个 .php 文件的开头。为了在多个网站上的所有 .php 文件中自动进行字符串替换,我做了一个 sed 语句来在第一次出现

sed '#s:<?php:<?php require('/var/www/html-mydomain.tld/zbblock/zbblock.php'); ?><?php#’ First-Occurence-Replacement-Sample.php > First-Occurence-Replacement-Sample.tmp && mv First-Occurence-Replacement-Sample.tmp First-Occurence-Replacement-Sample-NEW.php

运行 sed 语句得到以下结果:
制作了 1 个名为 First-Occurence-Replacement-Sample-NEW.php 的文件,GOOD
2 未进行所需的字符串替换。不好

 # ls -l
 -rw-r--r-- 1 root root 39 Feb 17 15:40 First-Occurence-Replacement-Sample-NEW.php
 -rw-r--r-- 1 root root 39 Feb 17 15:13 First-Occurence-Replacement-Sample.php

 # nano First-Occurence-Replacement-Sample-NEW.php

 Line 1 <?php <<< string wasn’t replaced as desired.
 Line 2 /***************************************************************************
 Line 3 <?php <<< This second occurrence should never be replaced
 Line 4 ?> ?>

所需的 sed 语句行为

字符串替换前的示例文件

 Line 1 <?php
 Line 2 /***************************************************************************
 Line 3 <?php
 Line 4 ?>

字符串替换后的示例文件

 Line 1 <?php require('/var/www/html-mydomain.tld/zbblock/zbblock.php'); ?><?php
 Line 2 /***************************************************************************
 Line 3 <?php <<< This second occurrence should never be replaced
 Line 4 ?> ?>

需要如何更改 sed 语句才能实现所需的替换?

在我得到帮助让这个 sed 语句正常工作后,我想把它放在一个脚本中,以便在一个充满 .php 文件的整个目录上运行替换,如下所示:

创建脚本文件: # nano zbblock-string-insertion.bash

 #! /bin/bash
 for f in *.php
 do
 echo "Converting $f"
 sed '#s:<?php:<?php require('/var/www/html-mydomain.tld/zbblock/zbblock.php'); ?><?php#’ $f > $f.tmp && mv $f.tmp $f
 done

保存文件 zbblock-string-insertion.bash ,使其可执行,然后运行它!

肯纳沃兹, 它有效,谢谢!你是个天才!不要让你的姻亲告诉你有什么不同。

要递归目录,请将 Kenavox 提供的命令行修改为:

find -name '*.php' -type f -exec sed -I.........

现在。该命令执行递归替换。

【问题讨论】:

  • 没有多大意义。最好使用 php.ini 或使用 auto_prepend_file。但通常我推荐替代方案,因为 ZB Block 不再积极开发,不支持 IPv6 并且有许多过时(和错误)的签名。
  • 感谢您的提示。您推荐/使用哪种第三方解决方案?
  • 我目前在 100 多个网站上使用来自 nintechnet.com 的 NinjaFirewall。很快就会有一个新版本,它要好得多,当前版本仍然非常强大、快速、可靠且易于维护。我还使用文件监控解决方案、CIDR 阻止列表和其他东西,所有链接在websectools.com phpMussel 和 IDRAM 是由也是 SpambotSecurity 论坛成员的 Maikuolan (Caleb) 创建的。 CIDRAM、垃圾推荐黑名单和 NinjaFirewall 是 ZB Block 的完整且安全的替代品。
  • 我会调查一下。谢谢。

标签: php bash sed


【解决方案1】:

希望这会有所帮助:

find . -name *.php -type f -exec sed -i "1 s~<?php~<?php require('/var/www/html-mydomain.tld/zbblock/zbblock.php'); ?>&~" {} \;

它查找当前目录中或下的所有 php 文件,并对每个文件应用 sed 命令。

sed 命令将 php require 命令添加到文件第一行的第一个匹配项。

【讨论】:

  • 它有效,谢谢!你是个天才!不要让你的姻亲告诉你任何不同。
  • 知道如何使 find 递归吗?
  • 我已经更新了命令,现在从当前目录递归查找所有php文件(find . -name '*.php'
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 2021-10-28
  • 1970-01-01
  • 2023-03-20
  • 2014-12-28
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多