PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script zum autom. unzippen im Netzwerk



22-09-2000, 08:41
Hi,
untenstehend mein Shellscript, das automatisch ZIP-Dateien entpackt. Es wird auf Viren gecheckt und auf Dateien, die typischerweise in Programmen enthalten sind, da meine Netzwerkbenutzer keine Viren oder Programme einschleppen sollen.

Es in diesem noch ein Fehler, den ich noch nicht gefunden habe oder sonst etwas vergessen worden?
MfG,
Wernr

<pre>
#!/bin/bash
# Shell-sript zum automatischen Entpacken von Zip-Dateien
# Wechseln ins Einlauf-Verzeichnis

# Verzeichnis aus dem Datei geholt wird
INDIR="/ska_fs2/pool/skadaten/unzip/in/"
# Verzeichnis wo Datei abgelegt wird
OUTDIR="/ska_fs2/pool/skadaten/unzip/out/"
# Verzeichnis wo Dateien abgelegt werden, wenn Virus entdeckt wird
INFECT="/root/batches/unzip/ska_fs2/pool/skadaten/unzip/in/"
# HOME Directory
INFECTROOT="/root/batches/unzip"
# Ablage f. virenverseuchte Zips
VIRUS="/root/virus/"
# HOME Directory
ROOTDIR="/root/batches/unzip/"
# Arbeitsverzeichnis f. Zipper
ARBEIT="/root/batches/unzip/arbeit/"
# Ablageverzeichnis f. Zips mit Programmen
ABLAGE="/root/batches/unzip/ablage/"

# Umleitung der Fehlerausgabe in zentrale Datei
exec >>${ROOTDIR}unzip.log 2>&1

# Suchen nach den ZIP-Dateien
cd ${INDIR}
# for i in *.zip
for i in $(ls)
do
# Ausgabeverzeichnis erstellen
cd ${INDIR}
echo "Schleife $i"
mkdir ${OUTDIR}$i
# verschieben der Datei in ein Arbeitsverzeichnis auf dem Linux-Server
# da sonst event. der Virenscanner auf dem Novellserver in den Ablauf
# durch loeschen eingreift
rm -r ${ARBEIT}*
cp $i ${ARBEIT}$i
rm ${INDIR}$i
# Zipdatei auf Viren Pruefen,
# verseuchte Dateien nach /root/d verschieben
# /usr/local/uvscan/uvscan ${ARBEIT}$i -m ${INFECTROOT} --unzip -r --noexpire --analyse
/usr/local/uvscan/uvscan ${ARBEIT}$i --unzip -r --noexpire --analyse >${ROOTDIR}viruswarnung
# folgendes prueft, ob im benanten Verzeichnis Dateien
# vorhanden sind,
# wenn Dateien vorhanden sind wird die Schleife ausgefuehrt
# wc -w zaehlt die Vorkommen
if [ $? -eq 13 ] ;
then
# Bei Virenbefall Hinweisdatei in Ausgabeverzeichnis erstellen
cp ${ROOTDIR}virushinweis ${OUTDIR}/$i/virushinweis
# Dateien im Virenpruefverzeichnis loeschen
# Orginalzip in Virusverzeichnis verschieben und in in $INDIR loeschen
cp -r -f ${ARBEIT}$i ${VIRUS}
rm ${ARBEIT}$i
mail -s "Virus in $i gefunden " v-virus.sys@domaene.de<${ROOTDIR}viruswarnung
else
# Zipdatei in Arbeitsverzeichnis entpacken
/usr/bin/unzip ${ARBEIT}$i -d ${ARBEIT}$i.dir
# Dateien auf Programme testen
# Dateien mit .exe, .dll, .ins usw
# GROSS- und klein-Schreibung beachten, da unter LINUX relevant
# Wenn Programm nur Datei mit Programmhinweis
# nach Ausgabeverzeichnis kopieren
cd ${ARBEIT}$i.dir
# auch in Untervezeichnissen nach Dateien suchen und
# in Datei ausgeben
ls -R > ${ARBEIT}datei.gefunden
# die Liste nach Mustern durchsuchen und die gefunden Stellen zaehlen
DATANZAHL=$(cat ${ARBEIT}datei.gefunden |grep -f ${ROOTDIR}dateiliste|wc -w)
if [ $DATANZAHL -ne 0 ] # Programminhalte gefunden
then
cp ${ROOTDIR}programmhinweis ${OUTDIR}/$i/programmhinweis
rm ${ARBEIT}datei.gefunden
mkdir ${ABLAGE}$i
cp -r -f ${ARBEIT}$i ${ABLAGE}$i/
rm -r ${ARBEIT}*
mail -s "Programm in $i gefunden " w.ginzky@domaene.de<${ROOTDIR}programm
else
# kein Virus und keine Progamminhalte gefunden
# Dateien werden dem Benutzer zur Verfuegung gestellt
/usr/bin/unzip ${ARBEIT}$i -d ${OUTDIR}$i
cd ${ROOTDIR}
rm -r ${ARBEIT}*
mail -s "Zip wurde entpackt" w.ginzky@domaene.de<${ROOTDIR}program.txt
fi
fi
done # Ende for-schleife

exit 0
</pre>

22-09-2000, 19:38
Hallo,
entschuldige, wenn ich es nicht richtig geschrieben habe. Das Script geht, aber das heißt nicht, das es wirklich fehlerfrei ist.
Außerdem dachte ich mir, daß es vielleicht ganz nützlich ist, wenn auch mal Lösungen besprochen werden. Da kann man immer mal abkupfern :-) .
Zu Deinen Fragen, das ist gewollt:
1) es sollen nur Zip´s ausgepackt werden, die heißen immer so, oder?
2) das Verzeichnis muß leer sein, sonst beeinflußt event. eine alte Datei die Virenprüfung.
MfG,
Werner

pitu
23-09-2000, 00:14
<pre>

cd ${INDIR}
# for i in *.zip
for i in $(ls) <- Funktioniert natuerlich nur, wenn
wirklich alle Dateien Zips sind.
do
# Ausgabeverzeichnis erstellen
cd ${INDIR}
echo "Schleife $i"
mkdir ${OUTDIR}$i
# verschieben der Datei in ein Arbeitsverzeichnis auf dem Linux-Server
# da sonst event. der Virenscanner auf dem Novellserver in den Ablauf
# durch loeschen eingreift
rm -r ${ARBEIT}* <- Mit jedem Schleifendurchgang loescht du
hier den Inhalt vom Verzeichniss. Absicht?

</pre>


Der Rest schaut auf den ersten Blick OK aus. Wo taucht der Fehler denn auf? wie macht es sich bemerkbar, was tut das Script denn nicht?

thorsten


------------------
Thorsten Wandersmann
SuSE GmbH, Nuernberg


[Dieser Beitrag wurde von Thorsten Wandersmann am 22. September 2000 editiert.]

pitu
23-09-2000, 09:52
Zu 1.
Du laesst bei deiner Lösung zu, das ALLE sich im Verzeichniss befindlichen Dateien als Zips behandelt werden. Wenn jetzt was dareinkopiert wird, was kein Zip ist, wird die Datei trotzdem als solches behandelt.

In der Annahme das Zip-Archive immer .zip heissen (oder .ZIP) ist das ls *.zip schon besser. wegen der Groß-/Kleinschreibung:

for i in `ls *.[Zz][Ii][Pp]`

Damit hast du alle Möglichkeiten der Schreibweise berücksichtigt.

Eine andere Möglichkeit waere natürlich das file zu überpruefen:

<pre>
FILE=`file $i`
case "$i" in
*"Zip archive"*)
echo $i ist ein Zip-Archiv
;;
esac
</pre>

Damit ist die Namesgebung nun wirklich egal.

Zu 2.: Ja klar, ich wollte nur sichergehen, das es das ist was du in dem Fall wolltest.

zu nicht fehlerfrei: Wie macht sich das bemerkbar?

zu besprechen: gute Idee. Schön waere es noch, wenn Leerzeilen ohne Probleme erhalten werden. Eine Idee an den Admin (für nach dem Urlaub http://www.linuxforen.de/ubb/wink.gif ) : Wie waere es damit, das in den Scripten nach pre und /pre gesucht wird, und dazwischen die Leerzeilen zu einem /pre pre umgewandelt werden?

thorsten

------------------
Thorsten Wandersmann
SuSE GmbH, Nuernberg

30-09-2000, 10:36
Hallo,
vielen Dank für die Hilfe,
mein Script scheint nun zu laufen :-) .
MfG,
Werner