Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch Suche nach Dateiendungen in zusammenhang mit darauffolgende Aktionen

Frage Entwicklung Batch & Shell

Mitglied: AngryWookiee

AngryWookiee (Level 1) - Jetzt verbinden

10.05.2011, aktualisiert 11:39 Uhr, 3769 Aufrufe, 13 Kommentare

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 !

Mit freundlichen Grüßen

Batch:
01.
@echo on 
02.
REM Pfade 
03.
	set alert="C:\OSC_Antihack\alert.htm" 
04.
	set dirlog="C:\OSC_Antihack\dir.log" 
05.
	set quarantaine="C:\OSC_Antihack\Quarantaine" 
06.
	set folders=C:\OSC_Antihack\folders.txt 
07.
 
08.
REM Auslesen aus Datei; Schreiben von Dirlog 
09.
	FOR /F %%f IN (%folders%) DO ( 
10.
		dir %%f > %dirlog% 
11.
 
12.
		REM Suche nach Dateien 
13.
		find /c /i ".htm" %dirlog% 
14.
		if errorlevel 0 ( set a=1 
15.
				xcopy /C /Y %%f\*.htm %quarantaine%  
16.
				del %%f\*.htm" 
17.
18.
 
19.
		find /c /i ".html" %dirlog% 
20.
		if errorlevel 0 ( set a=1 
21.
				xcopy /C /Y %%f\*.html %quarantaine%  
22.
				del %%f\*.html" 
23.
24.
			 
25.
		find /c /i ".php" %dirlog% 
26.
		if errorlevel 0 ( set a=1 
27.
				xcopy /C /Y %%f\*.php %quarantaine%  
28.
				del %%f\*.php" 
29.
30.
			 
31.
		REM Auswerten von Zähleraufgabe und mögliches Setzen von Alarm 
32.
		if %a%==1 ( 
33.
			echo Fehler in %%f > %alertlog% 
34.
			set all=1 
35.
36.
		set a=0 
37.
38.
 
39.
	if %all%==1 ( 
40.
		echo NOK > %alert% 
41.
	)
[Edit Biber] Codeformatierung [/Edit]
Mitglied: Jochem
10.05.2011 um 11:57 Uhr
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 chem
Bitte warten ..
Mitglied: bastla
10.05.2011 um 11:59 Uhr
@Jochem
Eigentlich hätte ich "folders.txt" als eine Liste von Ordnern interpretiert ...

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
10.05.2011 um 12:01 Uhr
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
Bitte warten ..
Mitglied: Jochem
10.05.2011 um 12:05 Uhr
Moin,

Ok, überredet . Ich sagte ja "Bauchgefühl".

Gruß J chem
Bitte warten ..
Mitglied: bastla
10.05.2011 um 12:06 Uhr
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
  • 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:
01.
find /c /i ".htm" %dirlog% && ( 
02.
    set a=1 
03.
    move "%%f\*.htm" %quarantaine% 
04.
)
Mit "&&" verknüpfte Anweisungen werden nur ausgeführt, wenn der vorhergehende Befehl einen Errorlevel 0 geliefert hat (Gegenstück: "||").

Die Abfrage kannst Du etwa so realisieren:
01.
if defined a ( 
02.
    echo Fehler in %%f > %alertlog% 
03.
    set all=1 
04.
05.
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
Bitte warten ..
Mitglied: AngryWookiee
10.05.2011 um 12:07 Uhr
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.
Bitte warten ..
Mitglied: AngryWookiee
10.05.2011 um 12:10 Uhr
Okay nun sind alle schneller gewesen als ich

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.
Bitte warten ..
Mitglied: Friemler
10.05.2011 um 12:16 Uhr
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...

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

Gruß
Friemler
Bitte warten ..
Mitglied: AngryWookiee
13.05.2011 um 13:27 Uhr
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.

Mit freundlichen Grüßen.

01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
REM Pfade 
04.
	set alert="C:\OSC_Antihack\alert.htm" 
05.
	set dirlog="C:\OSC_Antihack\dir.log" 
06.
	set quarantaine="C:\OSC_Antihack\Quarantaine" 
07.
	set folders=C:\OSC_Antihack\folders.txt 
08.
	set alertlog="C:\OSC_Antihack\alert.log" 
09.
 
10.
	REM Auslesen aus Datei; Schreiben von Dirlog 
11.
	FOR /F %%f IN (%folders%) DO ( 
12.
	 
13.
		dir %%f > %dirlog% 
14.
 
15.
		REM Suche nach Dateien 
16.
		find /c /i ".htm" %dirlog% && (  
17.
			set !a!=1  
18.
				xcopy /C /Y %%f\*.htm %quarantaine%  
19.
				del %%f\*.htm 
20.
21.
		 
22.
		find /c /i ".html" %dirlog% && (  
23.
			set !a!=1  
24.
				xcopy /C /Y %%f\*.html %quarantaine%  
25.
				del %%f\*.html 
26.
27.
			 
28.
		find /c /i ".php" %dirlog% && (  
29.
			set !a!=1  
30.
				xcopy /C /Y %%f\*.php %quarantaine%  
31.
				del %%f\*.php 
32.
33.
 
34.
		REM Auswerten von Zähleraufgabe und mögliches Setzen von Alarm 
35.
		if defined a (  
36.
			echo Fehler in %%f > %alertlog%  
37.
			echo NOK > %alert%  
38.
		)  
39.
		set a=0 
40.
41.
	
Bitte warten ..
Mitglied: Friemler
13.05.2011 um 13:37 Uhr
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
Bitte warten ..
Mitglied: AngryWookiee
13.05.2011 um 13:42 Uhr
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

Mit freundlichen Grüßen. AngryWookiee
Bitte warten ..
Mitglied: Friemler
13.05.2011 um 13:52 Uhr
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
Bitte warten ..
Mitglied: AngryWookiee
13.05.2011 um 13:58 Uhr
Yeeha !!!!

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!!!

Mit freundlichen Grüßen. AngryWookiee
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (10)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...