angrywookiee
Goto Top

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:
@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]

Content-ID: 165963

Url: https://administrator.de/contentid/165963

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

Jochem
Jochem 10.05.2011 um 11:57:36 Uhr
Goto Top
Moin,

rein bauchtechnisch vermute ich, daß der Ordner "folders.txt" vom "for-Befehl" nicht als Ordner erkannt wird, sondern als Datei. Nenn doch spaßeshalber den Ordner mal um in "folders" und starte die Abfrage neu.

Gruß J face-smile chem
bastla
bastla 10.05.2011 um 11:59:48 Uhr
Goto Top
@Jochem
Eigentlich hätte ich "folders.txt" als eine Liste von Ordnern interpretiert ...

Grüße
bastla
Friemler
Friemler 10.05.2011 um 12:01:57 Uhr
Goto Top
Hallo AngryWookiee,

willkommen im Forum. Du machst da gleich mehrere Fehler:
  • Du veränderst die Variable a innerhalb der FOR-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:

Gruß
Friemler
Jochem
Jochem 10.05.2011 um 12:05:58 Uhr
Goto Top
Moin,

Ok, überredet face-wink. Ich sagte ja "Bauchgefühl".

Gruß J face-smile chem
bastla
bastla 10.05.2011 um 12:06:58 Uhr
Goto Top
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 face-wink) [/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 face-wink [/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="  
Ob eine Variable überhaupt existiert, kann auch innerhalb einer Schleife mit "if defined" festgestellt werden (wobei es egal ist, welchen Wert sie hat).

Grüße
bastla
AngryWookiee
AngryWookiee 10.05.2011 um 12:07:05 Uhr
Goto Top
Hallo und dankeschön für die schnellen Antworten

Verstehe eure Lösungsansätze noch nicht ganz.

Folders.txt ist kein Ordner sondern eine Textdatei in dieser die Verzeichnisse stehen welche zu überprüfen sind.

@Jochem: Hast du da Datei und Ordner durcheinander gebracht oder verstehe ich dich da echt falsch ?

@bastla: Genau, in Folders.txt ist eine Liste von Ordnern enthalten.
AngryWookiee
AngryWookiee 10.05.2011 um 12:10:32 Uhr
Goto Top
Okay nun sind alle schneller gewesen als ich face-wink

Danke viel mal für die vielen Infos. Ich werde dies versuchen noch heute so umzusetzen wie ihr mir das beschrieben habt. Spätestens morgen gebe ich euch dann das Feedback zurück.

Nochmals besten Dank an alle.
Friemler
Friemler 10.05.2011 um 12:16:21 Uhr
Goto Top
Moin bastla,

naja, um zu erkennen dass z.B. bei
del %%f\*.htm"
in Zeile 16 ein Anführungszeichen entweder zu viel oder zu wenig ist, muss man weder Chuck Norris noch ein Friemler sein... face-wink

[EDIT]
Fragt sich sowieso, ob Mr. Norris das erkannt hätte.
[/EDIT]

Gruß
Friemler
AngryWookiee
AngryWookiee 13.05.2011 um 13:27:26 Uhr
Goto Top
Hallo zusammen

Ich habe nun das Script so angepasst wie ihr mir empfohlen habt. Nun scheint die Dateisuche sowie der Verschiebungsteil wunderbar zu funktionieren.
Das Problem welches ich nicht beheben konnte ist die Auswertung.

Die Dateien (sofern) gefunden werden korrekt wegkopiert. Nach dem verschieben wird jedoch kein alertlog sowie alert.htm geschrieben.
Ich habe versucht die variable a vor der auswertung mit einem echo zu überprüfen um so feststellen zu können ob der set befehl überhaupt funktioniert.
Er gab mir leider nichts ausser Echo ist ausgeschaltet aus. obwohl für die ausgabe echo angegeben wurde.

Ich poste nochmals das script. Irgendwo in der auswertung, verzögerte Erweiterung von Variablen, oder im Set befehl selbst übersehe ich was.

mfg.

@echo off & setlocal enabledelayedexpansion

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
	set alertlog="C:\OSC_Antihack\alert.log"  

	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% && (   
			set !a!=1 
				xcopy /C /Y %%f\*.htm %quarantaine% 
				del %%f\*.htm
		)
		
		find /c /i ".html" %dirlog% && (   
			set !a!=1 
				xcopy /C /Y %%f\*.html %quarantaine% 
				del %%f\*.html
		)
			
		find /c /i ".php" %dirlog% && (   
			set !a!=1 
				xcopy /C /Y %%f\*.php %quarantaine% 
				del %%f\*.php
		)

		REM Auswerten von Zähleraufgabe und mögliches Setzen von Alarm
		if defined a ( 
			echo Fehler in %%f > %alertlog% 
			echo NOK > %alert% 
		) 
		set a=0
	)
	
Friemler
Friemler 13.05.2011 um 13:37:52 Uhr
Goto Top
Hallo AngryWookie,

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
AngryWookiee
AngryWookiee 13.05.2011 um 13:42:35 Uhr
Goto Top
Hallo Friemler

Besten dank für den Hint!
Ich habe es gleich mal ausprobiert. nun wird mir das alert.htm und das alert.log auch geschrieben wenn keine datei weg zukopieren ist.
Sprich a ist für ihn immer deffiniert darum schreibt er in der Prüfung ab Zeile 34. die Dateien.
Liegt das am Setbefehl ?

Habe den untersten set bereits nach set "a=" angepasst so das kein Wert darin steht. anscheinend ist a dann immernoch als was definiert face-sad

mfg. AngryWookiee
Friemler
Friemler 13.05.2011 um 13:52:26 Uhr
Goto Top
Hallo AngryWoockiee,

stimmt das
set "a="
hatte ich doch glatt vergessen.

Falls Du das Script aus einem Konsolenfenster startest, gib mal
set a
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
AngryWookiee
AngryWookiee 13.05.2011 um 13:58:56 Uhr
Goto Top
Yeeha !!!! face-smile

Besten Dank Herr Friemler !!

Ich hatte tatsächlich a=0 gesettet.

Habe nun ein neues Shellfenster geöffnet. Nun Funktioniert das Script einwandfrei !

Besten Dank an alle Helfer!!!

mfg. AngryWookiee