Batch Suche nach Dateiendungen in zusammenhang mit darauffolgende Aktionen
Hallo zusammen
Ich habe ein grosses Problem bei einer Batch Datei. In mehreren Webverzeichnisen auf einem Server werden in ein Bilder Upload Ordner immer wieder .php Scripte hochgeladen welche dann ausgeführt werden. So ist es nun öfters schon vorgekommen das die netten Herren sich unbefugt zugriff beschaffen konnten. Ich wollte nun ein Script schreiben das soetwas verhindern kann. Ich bekomme jedoch immer eine Fehlermeldung bei einer ganz simplen FOR /F Schleife und sehe es total nicht ein wieso das nicht gehen soll ...
Ich Poste hier mal das Script das ich habe.
Ich möchte aus der Datei folders.txt die Pfade lesen der Verzeichnise. danach möcht eich einen Dir in das dir.log schreiben um darin nach Dateiendungen zu suchen. Wenn eine solche Datei existiert soll mir a auf 1 gesettet werden (Später für die Auswertung), ebenfalls soll das Script die betroffenen Dateien in die Quarantaine verschieben. Findet er nichts soll er einfach weiter das Script arbeiten. Am Schluss möchte ich prüfen ob a=1 ist um so ein Alarm (via anderm Tool) zu schlagen. da a jedoch für den nächsten durchlauf wieder auf 0 zurückgesetzt werden muss habe ich das so arangiert dass wenn a=1 ist das all=1 wird. somit kann ich a wieder verwenden und kann das all für die auswertung verwenden.
der Fehler kommt bei der Ausführung und besagt "(" ist syntaktisch an dieser Stelle nicht verarbeitbar. so wie ich es nachvollziehen kann ist dies bei der Zeile " FOR /F %%f IN (%folders%) DO ("
Was mache ich falsch ? Besten Dank für eure Zeit und Comments !
mfg
Batch:
[Edit Biber] Codeformatierung [/Edit]
Ich habe ein grosses Problem bei einer Batch Datei. In mehreren Webverzeichnisen auf einem Server werden in ein Bilder Upload Ordner immer wieder .php Scripte hochgeladen welche dann ausgeführt werden. So ist es nun öfters schon vorgekommen das die netten Herren sich unbefugt zugriff beschaffen konnten. Ich wollte nun ein Script schreiben das soetwas verhindern kann. Ich bekomme jedoch immer eine Fehlermeldung bei einer ganz simplen FOR /F Schleife und sehe es total nicht ein wieso das nicht gehen soll ...
Ich Poste hier mal das Script das ich habe.
Ich möchte aus der Datei folders.txt die Pfade lesen der Verzeichnise. danach möcht eich einen Dir in das dir.log schreiben um darin nach Dateiendungen zu suchen. Wenn eine solche Datei existiert soll mir a auf 1 gesettet werden (Später für die Auswertung), ebenfalls soll das Script die betroffenen Dateien in die Quarantaine verschieben. Findet er nichts soll er einfach weiter das Script arbeiten. Am Schluss möchte ich prüfen ob a=1 ist um so ein Alarm (via anderm Tool) zu schlagen. da a jedoch für den nächsten durchlauf wieder auf 0 zurückgesetzt werden muss habe ich das so arangiert dass wenn a=1 ist das all=1 wird. somit kann ich a wieder verwenden und kann das all für die auswertung verwenden.
der Fehler kommt bei der Ausführung und besagt "(" ist syntaktisch an dieser Stelle nicht verarbeitbar. so wie ich es nachvollziehen kann ist dies bei der Zeile " FOR /F %%f IN (%folders%) DO ("
Was mache ich falsch ? Besten Dank für eure Zeit und Comments !
mfg
Batch:
@echo on
REM Pfade
set alert="C:\OSC_Antihack\alert.htm"
set dirlog="C:\OSC_Antihack\dir.log"
set quarantaine="C:\OSC_Antihack\Quarantaine"
set folders=C:\OSC_Antihack\folders.txt
REM Auslesen aus Datei; Schreiben von Dirlog
FOR /F %%f IN (%folders%) DO (
dir %%f > %dirlog%
REM Suche nach Dateien
find /c /i ".htm" %dirlog%
if errorlevel 0 ( set a=1
xcopy /C /Y %%f\*.htm %quarantaine%
del %%f\*.htm"
)
find /c /i ".html" %dirlog%
if errorlevel 0 ( set a=1
xcopy /C /Y %%f\*.html %quarantaine%
del %%f\*.html"
)
find /c /i ".php" %dirlog%
if errorlevel 0 ( set a=1
xcopy /C /Y %%f\*.php %quarantaine%
del %%f\*.php"
)
REM Auswerten von Zähleraufgabe und mögliches Setzen von Alarm
if %a%==1 (
echo Fehler in %%f > %alertlog%
set all=1
)
set a=0
)
if %all%==1 (
echo NOK > %alert%
)
[Edit Biber] Codeformatierung [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 165963
Url: https://administrator.de/contentid/165963
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo AngryWookiee,
willkommen im Forum. Du machst da gleich mehrere Fehler:
Tipps:
Gruß
Friemler
willkommen im Forum. Du machst da gleich mehrere Fehler:
- Du veränderst die Variable
a
innerhalb derFOR
-Schleife und fragst ebenfalls ihren Wert ab. Damit das funktioniert, muss die verzögerte Erweiterung von Variablen aktiviert und benutzt werden, d.h. statt%a%
musst Du!a!
schreiben. - In den Zeilen 16, 22 und 28 ist ein Anführungszeichen zu viel/zu wenig.
Tipps:
- Den Scriptlauf mit
ECHO OFF
analysieren - Tutorial zur FOR-Schleife
Gruß
Friemler
Hallo AngryWookiee und willkommen im Forum!
Auf Anhieb kann ich zwar den angesprochenen Syntaxfehler nicht erkennen [Edit] (ich bin ja nicht Friemler oder wenigstens Chuck Norris ) [/Edit], aber was nicht funktionieren wird ist
Soferne es Ordnernamen mit enthaltenen Leer- oder Sonderzeichen geben sollte, wären auch [Edit] genügend [/Edit] Anführungszeichen gefragt ...
Alternativen:
Die Abfrage kannst Du etwa so realisieren:
Ob eine Variable überhaupt existiert, kann auch innerhalb einer Schleife mit "
Grüße
bastla
Auf Anhieb kann ich zwar den angesprochenen Syntaxfehler nicht erkennen [Edit] (ich bin ja nicht Friemler oder wenigstens Chuck Norris ) [/Edit], aber was nicht funktionieren wird ist
- die Abfrage "
if errorlevel 0
" - damit wird nämlich auf einen Errorlevel größer-gleich 0 geprüft - der Vergleich von %a% innerhalb der Schleife (Stichwort: "delayedExpansion")
Soferne es Ordnernamen mit enthaltenen Leer- oder Sonderzeichen geben sollte, wären auch [Edit] genügend [/Edit] Anführungszeichen gefragt ...
Alternativen:
find /c /i ".htm" %dirlog% && (
set a=1
move "%%f\*.htm" %quarantaine%
)
Die Abfrage kannst Du etwa so realisieren:
if defined a (
echo Fehler in %%f > %alertlog%
set all=1
)
set "a="
if defined
" festgestellt werden (wobei es egal ist, welchen Wert sie hat).Grüße
bastla
Hallo AngryWookie,
Du schreibst
Die Kennzeichnung von Variablen durch
Was Du hier machst ist eine Variable mit dem Namen
Gruß
Friemler
Du schreibst
set !a!=1
Die Kennzeichnung von Variablen durch
%
oder (bei verzögerter Variablenerweiterung) durch !
ist nur auf der rechten Seite einer Zuweisung/bei Verwendung ihres Wertes nötig. Die Ausrufezeichen weglassen, dann sollte es funktionieren.Was Du hier machst ist eine Variable mit dem Namen
!a!
definieren.Gruß
Friemler
Hallo AngryWoockiee,
stimmt das
hatte ich doch glatt vergessen.
Falls Du das Script aus einem Konsolenfenster startest, gib mal
ein. Das zeigt alle Umgebungsvariablen an, die mit a anfangen. Evtl. hast Du im Environment aus irgendwelchen Gründen (vorheriger Scriptlauf mit auskommentierter Zeile 1) bereits eine Variable a.
Gruß
Friemler
stimmt das
set "a="
Falls Du das Script aus einem Konsolenfenster startest, gib mal
set a
Gruß
Friemler