ubuntuusers.de

Skript, um Virenschutzsignaturen für einen PC ohne Internetanschluß downzuladen

Status: Ungelöst | Ubuntu-Version: Ubuntu 8.04 (Hardy Heron)
Antworten |

passer-domesticus

Anmeldungsdatum:
25. August 2008

Beiträge: 127

Folgendes hatte ich erst unter „Baustelle“ gepostet, aber da war es wohl falsch und wurde weggeputzt. Hier bin ich aber hoffentlich mit dem Thema richtig.

Mittlerweile habe ich eine Lösung. Hier aber der gesamte Weg dorthin:

Aufgabe: Ein Skript erstellen, das ich nur anzuklicken brauche, um aktualisierte Virendefinitionen für einen Windows-PC (der ohne Internet-Zugang ist) auf einen USB-Stick zu laden.

Folgendes habe ich ausprobiert:

#!/bin/bash
rm -f ../Desktop/ivdf_fusebundle_nt_en.zip 
sleep 2
firefox http://dl.antivir.de/down/vdf/ivdf_fusebundle_nt_en.zip
echo  "Die Daten werden jetzt auf den Stick transportiert..."
mv -f ../Desktop/ivdf_fusebundle_nt_en.zip /media/Cruzer
echo "Der Cruzer muss eingesteckt sein und darf nicht (logisch) ausgehaengt sein."
echo "Letzte Gelegenheit, ihn einzustecken!"
echo "Die Uebertragung dauert erfahrungsgemaess ca 200 Sekunden. - Warte solange!"
sleep 200
echo "Der Stick wird jetzt (logisch) ausgehaengt..."
umount -l /media/Cruzer
rm -f ../Desktop/ivdf_fusebundle_nt_en.zip
echo "*********************************************"
echo "Der USB Stick kann jetzt herausgezogem werden"
echo "Firefox von Hand beenden"
echo "*********************************************"

Mir ist klar: das ist blutige Anfänger-Skriptprogrammierung. Es ist auch das erste Skript unter Linux, das ich schreibe. Also bat ich um Verbesserungsvorschläge zu folgenden Problemen:

1. Ich verwendete Firefox, um die Virenschutzsignaturen herunterzuladen. Firefox ist aber eigentlich ein GUI-Programm, und so bleibt das GUI nach getaner Arbeit auf dem Bildschirm.

2. Ohne den Befehl sleep 200 funktionierte das nicht: da überholte das umount den Kopiervorgang (die Zeit habe ich praktisch ermittelt, aber das ist natürlich Mist, falls die Virenschutzsignaturen größer werden). Beim zweiten Punkt habe ich vielleicht ein grundsätzliches Mißverständnis: Ich las, daß man ein & hinter einen Befehl schreiben soll, wenn er im Hintergrund ablaufen soll. Das hat mein mv-Befehl aber nicht. Ich nahm also an, daß der nächste Befehl erst an die Reihe kommt, wenn mv ... abgeschlossen ist. Aber die Fehlermeldungen, die ich sah, zeigten mir, daß ich da etwas in den falschen Hals bekommen habe. Aber wie ist es richtig? Auch der Firefox läuft ja weiter, auch nachdem er die Daten abgeholt hat. Wenn ich den Firefox nun aus so einem Skript heraus wieder "abschießen" wollte, wie bekomme ich dazu dessen PID heraus?

3. In dem Buch von Kofler habe ich gelesen, daß die GUI-Programme "alle" im Prinzip auch per Kommandozeile bedienbar seien. Doch dazu müßte ich wissen, wie all die vielen Helferlein, die ich per Anwendungen > ... aktivieren kann, denn eigentlich genau heißen. Dann könnte ich mir mit truedel --help oder man truedel usw schon die Beschreibungen holen. Aber anders, als sonst überall, kann ich nicht an der Stelle, an der ich ein Programm aktiviere, mit einem Rechtsklick mir die "Eigenschaften" des Objekts ansehen: Wie also finde ich den Namen eines Programms mit GUI heraus?

Lösung (der Aufgabe, aber nicht aller Fragen, die sich am Rand dabei stellten):

#!/bin/bash
rm -f ivdf_fusebundle_nt_en.zip 
echo "Der Cruzer muss eingesteckt sein und darf nicht logisch ausgehaengt sein."
sleep 2
wget http://dl.antivir.de/down/vdf/ivdf_fusebundle_nt_en.zip
echo  "Die Daten werden jetzt auf den Stick transportiert..."
mv ivdf_fusebundle_nt_en.zip /media/Cruzer
echo "Die Uebertragung dauert erfahrungsgemaess eine Weile. - Warte solange!"
sleep 2
echo "Der Stick wird jetzt (logisch) ausgehaengt..."
umount -l /media/Cruzer
rm -f ../Desktop/ivdf_fusebundle_nt_en.zip
echo "*********************************************"
echo "Der USB Stick kann jetzt herausgezogem werden"
echo "*********************************************"

Der springende Punkt ist also, wget statt Firefox zu verwenden (darauf hat mich freundlicherweise mein Neffe gebracht). Es bleibt aber die Frage, weshalb vorher eigentlich die sleep-Befehle notwendig waren und der umount-Befehl den Firefox „überholen“ konnte.

Wenn ich hier in der richtigen Ecke für Skriptprogrammierung bin: über Kommentare zur handwerklichen Verbesserung meiner Lösung und Erläuterungen würde ich mich freuen und andere blutige Anfänger mit Skriptprogrammierung unter Ubuntu vielleicht auch.

neongelbe

Anmeldungsdatum:
10. September 2009

Beiträge: Zähle...

Huhu ☺

Programme kannst du einfach mit killall beenden oder mit kill. Eine PID kannst du mit pgrep oder ps finden.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2503

Die ganzen "sleep ..." sind gefährlich, wie du schon gemerkt hast. Damit erzeugst du schöne Race-Conditions, was zu herrlich wunderlichen Ergebnissen führen kann. 😉 Bevor irgendwas nämlich auf irgendeinen Datenträger geschrieben wird, kommt diese Information erstmal in den Block-Buffer-Cache. Deswegen hast du auch Datenverlust, wenn du einen Stick einfach so rausziehst.

Wenn "umount" irgendwas abwürgt (hab ich noch nicht erlebt, aber sowas mache ich auch selten), dann versuche mal, vorher ein "sync" abzusetzen. Was mich persönlich jetzt aber auch ein bisschen verwirrt, ist dieser Hinweis in "man 3 sync":

The sync() function shall cause all information in memory that updates file systems to be scheduled for writing out to all file systems. The writing, although scheduled, is not necessarily complete upon return from sync().

Hm. Probieren kannst das ja trotzdem mal.

1
2
3
wget ...
sync
umount ...

Abgesehen davon könntest du mit "wget -P /media/C http://..." die Datei direkt auf den Stick speichern und dir dann das "mv" sparen.

Ich hab jetzt nicht genau verstanden, was sich da noch gegenseitig überholt – Firefox ist aber keine "einfache" Anwendung wie wget. Ich gehe mal stark davon aus, dass Firefox Downloads und sonstige Sachen nicht in dem Prozess/Thread erledigt, den du mit "firefox ..." an der Shell startest. Dadurch kommt es dann automatisch zu Asynchronitäten.

Was sich fernab all dessen auch noch anbieten würde, wäre alle Fehlschläge abzufangen und nicht einfach blind weiterzumachen. Im einfachsten Fall sieht das so aus:

wget ... || exit 1

Dann bricht das Skript an dieser Stelle ab, wenn wget nicht klappt.

Antworten |