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!