Tutorial zur Batch-Programmierung - Happy
Transcrição
Tutorial zur Batch-Programmierung - Happy
Tutorial zur Batch-Programmierung by Tsutomu Katsura [www.happy-security.de] Ich bin mir zwar darüber im klaren, dass es sich eigentlich nicht wirklich lohnt ein Tutorial zur Programmierung von DOS-Dateien zu schreiben. Trotzdem werden ich es der vollständigkeitshalber für unsere Website tun. Aus diesem Grund werde ich hier nun auch nur einen kleinen Teil vorstellen. Es soll euch nur helfen einige Routinen bei der Arbeit mit Windows zu vereinfachen und einen schnellen Einstieg in die Thematik der Programmierung im weitesten Sinne zu geben. Das schöne bei Batch ist, das man nicht erst einen Compiler benötigt um ein kleines Programm zu schreiben. Man benötigt einfach wie in HTML / PHP ein Notepad, mit dem man den Quelltext schreibt. Wenn man den Source-Code dann fertig hat, muss man nur noch die .txt in .bat umändern und schon kann man die Datei ausführen. Eigentlich ist es kein richtiges Programmieren, sondern eher eine Abarbeitung von DOS-Befehlen (Automatisierung). Aus diesem Grund ist es auch klar, warum wir keinen Compiler benötigen: Die Befehle werden vom Betriebssystem verarbeitet, oder besser gesagt von der command.com! Ok! Genug vom Geschwafel... lasset Taten folgen. Der wohl wichtigste Befehl echo dient zur Ausgabe von Text. Diesen Befehl gibt es in jeder Programmiersprache. Ich habe jeden Programmiercode fett hervorgehoben (das müsst ihr in die Bat-Datei schreiben). Das Ergebnis habe ich kursiv dargestellt. Die folgende Zeile in eine Datei schreiben und in c:/test.bat speichern. echo Hello World! Hello World! Um das Ergebnis jetzt zu sehen reicht es nicht die Datei auszuführen. Sie wird zwar ausgeführt mit allen Befehlen, aber wir können das nicht verfolgen. Dazu müssen wir unter Start -> Ausführen -> „cmd“ eintippen und mit c:/test.bat die Datei öffnen. So kann man ganz einfach Text ausgeben lassen. Will man einfach eine Leerzeile ausgeben lassen, so schreibt man echo. ohne Text. So kann man ganze Seite füllen und das sogar noch ein wenig übersichtlich. @echo off cls echo Hello World! echo. echo This is our World! The world of electron and switches. echo The beauty of baud. echo. echo by TheMentor Probiert das ganze einfach aus und schaut euch das Ergebnis an. Ich hab in den ersten Zeilen wieder zwei neue Befehle benutzt. @echo off macht die Ausgabe etwas übersichtlicher. Es werden nämlich so die Befehle ausgeblendet. Sollte schon etwas in der shell stehen, so sorgt cls dafür dass alles gelöscht wird und nur unser Text oben erscheint. Neuer Befehl (Schleifen) Oft kommt es vor, dass man eine Liste an Befehlen mehrmals hintereinander ausführen muss. Anstatt jetzt den Quelltext unnötig durch mehrfaches pasten dieser Liste aufzustocken, können wir dem Programm einfach sagen, dass es nach Abarbeitung der Befehle in der Liste noch einmal am Anfang anfangen soll. Dies funktioniert mit Sprungmarken. Der dazu benötigte Befehl lautet goto und ist etwas komplizierter als der einfache echo-Befehl. 1 @echo off 2 echo Das ist der Anfang 3 :Anfang 4 echo hier der Mittelteil 5 echo Diese Zeilen werden wiederholt. 6 Goto Anfang 7 echo Das ist das Ende ^_^ Jaaa, hier haben wir ein schönes Beispiel für eine Endlosschleife... Erklärung: 1.Befehlanzeige ausblenden 2.Textausgabe: „Das ist der Anfang“ 3.Setzen der Sprungmarke [Anfang] 4.1. Teil der in der Schleife ausgegeben werden soll angeben 5.2. Teil der in der Schleife ausgegeben werden soll angeben 6.Ende der Schleife durch Goto Anfang 7.Ausgabe des letzten Textes. (Geschafft) Als erstes gehen wir die Punkte 1-6 durch und springen dann von 6. wieder zur gesetzten Sprungmarke [Anfang] in Zeile 3. Das Problem ist jetzt bei dieser Endlosschleife, dass wir ab der 3. Zeile wieder so verfahren, wie eben auch. Wir gehen also bis zur Zeile 6 und springen dann wieder per Goto Anfang in die 3 Zeile. Das Wiederholt sich endlos lange... deswegen auch Endlosschleife! Doch was kann man dagegen tun? Am besten lassen wir den Computer überprüfen, ob wir schon einmal diese Schleife durchlaufen haben. Wenn das also der Fall ist, dann soll abgebrochen werden. Anderenfalls einfach weiter im Text. Hier nun der verbesserte Quelltext mit Überprüfungsfunktion. 01 @echo off 02 echo Das ist der Anfang 03 if %loop% == "fertig" GOTO Ende 04 :Anfang 05 echo hier der Mittelteil 06 echo Diese Zeilen werden wiederholt. 07 SET loop = "fertig" 08 Goto Anfang 09 :Ende 10 echo Das ist das Ende Dies ist eine Art die Aufgabe zu lösen. Wir haben nämlich ganz einfach mit einem Zeichenkettenvergleich (Zeile 03) überprüft, ob die Variable %loop% den Wert "fertig" besitzt. Natürlich ist es beim ersten Durchlauf nicht der Fall, so geht die Anweisung in Zeile 04 einfach weiter. Da wir aber in der Zeile 07 eine Wertzuweisung zu einer Variablen gemacht haben, gibt der Zeichenkettenvergleich bei der nächsten Schleifen ein TRUE aus und arbeitet den dahinterbefindlichen Befehl GOTO Ende ab. Nun sind wir aus der Schleife draußen und beenden die Datei mit einer letzten Meldung. Jetzt haben wir eben eine Variable selbst definiert... es gibt jedoch auch schon vordefinierte Variablen, die von DOS bereits einen Wert zu geschickt bekommen haben. Dies sind die sogenannten Sys-Vars! Hier werden wichtige Informationen gespeichert. Zum Beispiel der Name so wie die Version des Betriebssystems und verschiedene Pfad-Angaben. Hier eine Liste: ALLUSERSPROFILE APPDATA CommonProgramFiles COMPUTERNAME ComSpec HOMEDRIVE HOMEPATH LOGONSERVER NUMBER_OF_PROCESSORS OS Path PATHEXT ProgramFiles PROMPT SESSIONNAME SystemDrive SystemRoot TEMP TMP USERDOMAIN USERNAME USERPROFILE windir Am besten du öffnest dir die Command-Box, schreibst Echo BEFEHL und schaust dir die Ausgabe an. Bei WINDIR zum Beispiel würde bei den Meisten "C:\Windows" stehen. WICHTIG: NICHT diesen vordefinierten Variablen einen anderen Wert zuweisen, da sonst Fehler auftauchen könnten. Es kann jedoch sehr gut mit diesen Vars arbeiten. So kann man zum Beispiel ausgeben lassen, wer gerade als User angemeldet ist und gegebenenfalls mit einer IF-Anweisung unterschiedliche Begrüßungen ausgeben. Hier ein kleines Beispiel dazu: if %USERNAME% == "Gast" ECHO "Sie haben keinen Zugriff!" Nun sind wir endlich an dem Punkt, an dem es interessant wird. Jeder von euch kennt sicher schon einige DOS-Befehl, mit denen er früher (oder immer noch) in der Schule Unfug getrieben hat. Aber auch wenn ihr es nicht glaubt! Diese Dinge können sogar richtig komfortabel sein. Bleiben wir jetzt mal bei dem Beispiel mit der Schule (oder Arbeit... geht auch). Meistens ist es bei Netzwerken so, dass jeder seinen persönlichen Ordner hat, in welchem private Dinge gespeichert werden. Es gibt jedoch auch ziemlich neugierige Säcke, die überall drin rumschnüffeln müssen. Um die Täter zu überführen, können wir uns eine kleine Batch-File schreiben. Und das tun wir jetzt auch. Sonst wäre das ganze getippe hier ja völlig umsonst ^_^ 01 @echo off 02 SET Emfang = * 03 SET Message = "Ich habe unbefugt in fremden Daten geschnueffelt" 04 :endlos 05 net send %Emfang% %Message% %USERNAME% 06 GOTO endlos Ok... Zugegeben: Es ist etwas übertrieben unfair. Aber er ist selber schuld. Zudem werden auch die Kollegen auf ihn sauer sein, da jeder 100te von dieser kleiner Message mit seinem Namen bekommen. Nähere Erklärung für alle die, die es interessiert: In Zeile 02 und 03 weisen wir unseren Variablen wieder ein paar Werte zu. Der *-Stern bei Empfang soll heißen, dass die Nachricht an alle im Netzwerk befindlichen Rechner geht. Wir könnten die Nachricht auch nur an eine Person schicken (den Chef oder Admin *grins*)... dazu muss man nur den Netzwerk-Username benutzen. Naja und „Message“ sollte klar sein. Nun begeben wir uns in die Schleife. Als nächstes das Hauptanliegen: Versenden der Nachricht! Wir haben hier mit %Empfang% und %Message% die am Anfang derklarierten Variablen eingesetzt und am Ende noch über die vordefinierten Variablen den Namen des Spammers ausfindig gemacht. Funktioniert das Versenden einer Nachricht nicht, so sollte geschaut werden, ob NET SEND deaktiviert ist. Dazu entweder in der Console NET START eingeben oder über die Systemsteuerung -> Verwaltung -> Dienste -> Nachrichtendienst aktivieren. Nun noch einmal kurz zum Schluß eine kleine Arbeitserleichterung für alle die trotzdem gerne mit Console arbeiten. Wir schreiben uns ein Script, welches für uns automatisch ein komplettes Verzeichnis sichert, löscht und uns das Ergebnis anzeigt. Dabei lernen wir, wie einige einfache Datei-Befehle funktionieren und wie mit Parametern gearbeitet wird. Zunächst einmal kopieren wir uns aber erst den QT in eine neue Batch-Datei und erstellen ein neues Verzeichnis in C:\TEMP und fügen dort 5-6 Dateien von verschiedener Art hinein. Die Batch-Datei nennen wir backup.bat und speichern sie in C: 01 @echo off 02 cls 03 echo. 04 echo ----------------------------05 echo Backup fuer das Verzeichnis %1 06 XCOPY %1 %2 /I /Y 07 echo. 08 echo ----------------------------09 echo Dateien werden verglichen: 10 comp %1 %2 11 echo. 12 echo ----------------------------13 rmdir %1 /S 14 echo. 15 echo ----------------------------16 color 0A 17 echo BACKUP BEENDET 18 echo ============================= Ohne zusätzliche Eingabe bringt es nichts die Datei in der Console auszuführen. Wir benötigen zwei Parameter, die angeben was kopiert werden soll und wohin. Hoffe die vorhin erwähnte Aufgabe mit dem Anlegen von C:\TEMP ist bereits fertig... denn das brauchen wir jetzt. In der Console können wir das ganze jetzt einfach mal ausprobieren. C:\backup.bat c:\temp c:\save Das sieht doch richtig schön aus, oder? Wie immer haben wir in 01 die Befehlsanzeige ausgeblendet und alle alten Einträge gecleared. Der Übersichtshalber, habe ich immer eine Leerzeile und eine Trennlinie eingebaut. In Zeile 06 gehts jetzt los... Mit XCOPY kann der komplette Inhalt eines Verzeichnisses (%1=c:\temp) in ein anderes (%2=c:\save) kopiert werden. Diese beiden Variablen haben wir beim Ausführen in der Console mit eingetippt: c:\> C:\backup.bat c:\temp c:\save = BAT-Datei %1 %2 Beim Aufruf der backup.bat werden die beiden Pfadangaben automatisch von DOS in die Variablen %1 und %2 gespeichert. So muss man nicht immer die BAT-Datei editieren, wenn man ein anderes Verzeichnis sichern will. Jetzt sind schon mal die Dateien kopiert. Als nächsten schauen wir ob, die beiden Verzeichnisse jetzt identisch sind... also ob alle richtig kopiert wurde. Dazu verwenden wir den Befehl COMP und geben die beiden Verzeichnisse wieder an (%1 und %2). Als besondere Option habe ich noch eine Eingabe eingebaut, die nachfragt, ob das alte Verzeichnis gelöscht werden soll (RMDIR = ReMove DIRectory). Zum Schluß, wenn alles funktioniert hat, wird die Schriftfarbe auf grün gestellt (nur so aus Spaß ^_^) und die Meldung BACKUP BEENDET wird ausgegeben. Das war es eigentlich schon. Natürlich kann man noch viel mehr machen, aber ich wollte hier nur einen kleinen Einstieg geben. Wer sich mehr mit BATCH auseinandersetzen will, sollte einfach ein wenig in den alten Batch-sysDateien von Win95/98 herumschnüffeln und sich per help die wichtigsten Befehle in der Console ausgeben lassen. Auch wenn es nicht mehr viel Sinn macht mit BATCH zu programmieren, so ist es immer eine schöne Abwechslung und ein leichter Einstieg um das Grundprinzip des Programmierens zu verstehen. Ich hoffe es hat einigen Spaß gemacht diesen Text hier zu lesen. Wäre gut, wenn ihr mir eine Kritik schreiben würdet, damit ihr weiß, was ich beim nächsten Mal besser machen kann: WEBSITE: http://www.happy-security.de B-BOARD: http://forum.happy-security.de E-MAIL@: [email protected] Machts gut und viel spaß beim Surfen im Netz!