開発ブログ
Git、CSS、HTML、正規表現など、入門者がつまづきそうなポイントを中心に、役立ち情報発信します。。

sedコマンド:複数ファイルの文字列を一括で置換

最終更新:2018-09-14 by Joe

こないだレンタルサーバーにログインしたら、すべてのPHPファイルの冒頭に不審な(読めない)コードが挿入されていました。おそらくどこかからハッキングされて、バックドアらしきコードが仕込まれたようです。怖いですね。

かなり大量のファイルが一度に同じような改ざんを受けたされたので、まとめて処理するする、そんなときの「SED」コマンドをご紹介。

ファイルの文字列を置換する「sed」コマンド

SEDは、出力文字列を変更してくれるコマンド。本来は、標準出力なところを、-i オプションで、出力せずに、ファイルを直接書き換えることができるので、これを利用します。

$ sed -i -e '正規表現' FILE_NAME.txt;

これと繰り返し実行の「find 」コマンドを組み合わせることで、まとめてファイル内のテキストを書き換えてくれる。

ちなみに、SEDは「Stream Editor」の略だそうです。

find コマンドで複数ファイルをまとめて置換する

sed のみだと1つのファイルですが、これを find コマンドでファイルを探して一括でまとめて実行します。

改ざんされたのがPHPファイルだけだったので、書き換えるファイルを限定するため、-name オプションで、’.php’として、PHPファイルだけにしました。

$ find . -type f -name '*.php' -exec sed -i '' -e 's/theBackdoorCode//g' {} +;

MacOS の人は注意

マックのひとは、、-i オプションの直後に、 上記のように ” と、クオーテーションを使って空文字を入れないと、保存されるファイルに「xxxx.php-e 」とつづられ、意図しない事がおきて悲しい感じになりました。理由はよくわかりませんが、とりあえず空文字を入れておくとよいでしょう。

Linux 環境の人は不要なようです。

参考:

  • http://blog.shonanshachu.com/2013/02/macsed.html

 

閉じる