clamAV unter Ubuntu automatisch starten

Hallo,

ich habe hier einen Ubuntu 10.4 Rechner mit ClamAV aufgesetzt.
Jetzt möchte ich erreichen, dass sobald ein USB Medium eingesteckt wird, dieser automatisch mit ClamAV gestartet wird.
Alternativ wäre auch der Start per Klick auf einen Button möglich.
Da es später Windowsusertauglich sein muß, ist eine Lösung mittels Kommandozeile nicht tauglich.

Kann mir jemand helfen?

Viele Grüße

151KG

Hallo 151kg

Jetzt möchte ich erreichen, dass sobald ein USB Medium
eingesteckt wird, dieser automatisch mit ClamAV gestartet
wird.

Das Starten von Programmen oder Skripten bei hotplug-Ereignissen (z.B. Einstecken des USB-Sticks) erreichst Du mit udev-Regeln.
http://wiki.ubuntuusers.de/UDEV
Da gibt es neben einigen Beispielen auch weiterführende Links.

Viele Grüße
Marvin

Danke für den Link,

habe jetzt mal folgendes gemacht:
In /etc/udev/rules.d/ die Datei 10-meine.rules angelegt
dort ist folgendes drinnen:

BUS=="usb", ACTION=="add", KERNEL=="\*", SYSFS{idVendor=="1307", SYMLINK+="usbmedium", RUN+="/usr/local/bin/MeinScript"

Das Script hat die Rechte 755 und ist prinzipiell lauffähig. Zumindest bekomme ich die Fehlermeldungen der falschen Befehle, die dort drinnen stehen wenn ich es direkt starte. Aber das ist dann erst mein nächstes Probelm :smile:

Soweit ich das sehe wird der Symlink nicht angelegt.
Was mache ich falsch?

Hallo 151kg,

BUS==„usb“, ACTION==„add“, KERNEL=="*",
SYSFS{idVendor==„1307“, SYMLINK+=„usbmedium“,
RUN+="/usr/local/bin/MeinScript"

Was mache ich falsch?

Auf jeden Fall fehlt bei SYSFS{idVendor die schliessende Klammer:

BUS=="usb", ACTION=="add", KERNEL=="\*",SYSFS{idVendor **}** =="1307",SYMLINK+="usbmedium",RUN+="/usr/local/bin/MeinScript"

Viele Grüße
Marvin

Hallo 151kg,

BUS==„usb“, ACTION==„add“, KERNEL=="*",
SYSFS{idVendor==„1307“, SYMLINK+=„usbmedium“,
RUN+="/usr/local/bin/MeinScript"

Was mache ich falsch?

Auf jeden Fall fehlt bei SYSFS{idVendor die schliessende
Klammer:

aber nur hier im Posting :smile:
Im Script ist es drinnen.
Kennst Du (oder sonst jemand) Dich näher mit Udev aus?

Hallo 151kg,

aber nur hier im Posting :smile:

Hatte ich fast befürchtet…

Im Script ist es drinnen.
Kennst Du (oder sonst jemand) Dich näher mit Udev aus?

Naja, was heisst näher. Ich kenne das, was in den Links steht. Aber ich habe es gerade nochmal für meinen USB-Stick ausprobiert und da hat es funktioniert.
Meine Datei heisst persistent-usb.rules sieht so aus:

BUS=="usb", ACTION=="add", KERNEL=="sdc1", SYSFS{idProduct}=="1a00", SYMLINK+="backback"

Ich habe das bewusst klein und simpel gehalten (ohne Skript und ohne Metazeichen bei KERNEL==…) um Schreib- und sonstige Fehler auszuschliessen. Aber so hat es bei mir tatsächlich den Softlink auf sdc1 angelegt:

ubuntu@ubuntu:~$ ls -l /dev/back\*
lrwxrwxrwx 1 root root 4 2011-04-27 18:35 /dev/backback -\> sdc1

Vielleicht solltest Du auch erstmal so minimalistisch anfangen.
Sonstige Fehlerquellen, die mir jetzt so einfallen:
* falsche SYSFS{idProduct}
* nicht als root erstellt und/oder abgespeichert
* Regeln nicht mit

sudo service udev reload

neu eingelesen
Außerdem habe ich jetzt auch mal ein bewusst fehlerhaftes Skript eingefügt, auch damit wird der Softlink angelegt.
Mehr Fehlermöglichkeiten fallen mir jetzt nicht ein, denn auch die nicht gerade sinnvolle udev-Regel

BUS=="usb", ACTION=="add", KERNEL=="\*", SYSFS{idProduct}=="1a00", SYMLINK+="back%k", RUN+="/usr/local/bin/MeinScript"

funktioniert, samt Softlink und diesmal richtigem Skript.
Übrigens habe ich die Regel bewusst

persistent-usb.rules

genannt und nicht z.B.

10-persistent-usb.rules

damit sie garantiert nicht von anderen, nachfolgenden Regeln „überschrieben“ werden kann. /etc/udev/rules.d/README empfiehlt dies:

If the ordering of files in this directory are not important to you,
it’s recommended that you simply name your files „descriptive-name.rules“
such that they are processed AFTER all numbered rules in both this
directory and /lib/udev/rules.d and thus override anything set there.

Viele Grüße
Marvin

Hallo,

Was mache ich falsch?

Das hier:

Zumindest bekomme ich die Fehlermeldungen der falschen
Befehle, die dort drinnen stehen

Ich zumindest kenne die „Fehlermeldung der falschen Befehle“ nicht. Zudem: ich würde mal probieren, die im Script aufgerufenen Befehle dort mit vollem Pfadnamen aufzunehmen, die Wahrscheinlichkeit, dass Udev das gleiche Environment setzt wie die $SHELL ist eher gering-

Sebastian

Hallo Sebastian,

ich habe mich vielleicht missverständlich ausgedrückt.
Wenn ich das Script manuell aufrufe, kommt ne Fehlermeldung, die mich im moment noch nicht interessiert. Das Interessiert mich erst, wenn das Script von UDev aufgerufen wird. Und das passiert noch nicht.
udev macht soweit ich mitbekomme gar nichts. Sobald udev mein Script aufruft, werde ich mich um dessen Inhalt kümmern.

Hallo,

mal ne ganz dumme Frage:
wie teste ich eigentlich, ob der Symlink angelegt wurde?

In der geposteten Anleitung steht ja, dass ich über den Befehl

mount /media/usbmedium

den USBstick mounten kann. Nur leider bekomme ich dann immer die Meldung:

Konte /media/usbmedium nicht in /etc/fstab oder /etcmtab fineden

Hätte udev in eine der Dateien was eintragen sollen?

Hallo 151kg,

wie teste ich eigentlich, ob der Symlink angelegt wurde?

Indem Du mit ls -l nachsiehst, ob ein Softlink angelegt wurde. Deine Befefehlszeile lautet ja:

BUS=="usb", ACTION=="add", KERNEL=="\*", SYSFS{idVendor}=="1307", SYMLINK+="usbmedium", RUN+="/usr/local/bin/MeinScript"

Da Du bei SYMLINK usbmedium angegeben hast, wird im Verzeichnis /dev ein Softlink usbmedium angelegt.
Das kontrollierst Du, indem Du nach dem Einstecken des USB-Sticks bzw. der USB-Festplatte z.B. folgenden Befehl eingibst:

ls -l /dev/usbmedium

Bei Erfolg erhältst Du dann eine ähnliche Meldung wie bei mir, also z.B. sowas:

**l** rwxrwxrwx 1 root root 4 2011-04-27 18:35 /dev/usbmedium **-\>** sdc1

wichtig ist das erste l am Anfang, daß dir sagt daß es sich um einen Link handelt bzw. dieser angedeutete Pfeil ->, der sozusagen auf das Ziel zeigt, das bei dir natürlich nicht unbedingt sdc1 heissen muss.
Wenn der Link nicht vorhanden ist, würdest Du in etwa so eine Ausgabe bekommen:

ls -l /dev/usbmedium
ls: Zugriff auf /dev/usbmedium nicht möglich: Datei oder Verzeichnis nicht gefunden

Aber das musst Du unbedingt kontrollieren, wenn das USB-Medium noch eingesteckt ist. Sobald Du das Medium wieder entfernst, wird von udev auch der Link gelöscht.

Hätte udev in eine der Dateien was eintragen sollen?

Nein, udev legt so nur den Softlink im Verzeichnis /dev an und startet das angegebene Skript, in dem Du dann deine gewünschten Befehle ausführen lässt.

Viele Grüße
Marvin

Ich habe es mitlerweile hinbekommen, dass mein Script funktioniert (Vielen Dank auch an Deine Tips hier aus dem Board).
Weiterhin habe ich es geschafft, das sobald ein USB Stick eingesteckt wird, das Script durchgeführt wird und tut was es soll.
Leider sehe ich keinerlei Ausgabe des Scriptes.
Wie kann ich die Ausgabe des Scriptes auf den Bildschirm bringen (und solange da lassen, bis der User es Quittiert hat)

Hallo 151kg,
beinahe hätte ich diese Anfrage übersehen (deine Anfragen verteilen sich ein wenig :wink:

Leider sehe ich keinerlei Ausgabe des Scriptes.

Das ist auch richtig so, weil die von udev aufgerufenen Skripte kein Terminal besitzen (und eigentlich auch nicht brauchen).

„udev does not run these programs on any active terminal, and it does not execute them under the context of a shell. … if it is a shell script ensure it starts with an appropriate shebang (e.g. #!/bin/sh), and do not expect any standard output to appear on your terminal.“
http://www.reactivated.net/writing_udev_rules.html#e…

Wie kann ich die Ausgabe des Scriptes auf den Bildschirm
bringen

Du kannst rumtricksen, indem Du die Ausgabe deines Skriptes in ein geöffnetes Terminal umleitest. Dazu musst Du mit tty feststellen, welchen Filenamen das mit standard input verbundene Terminal besitzt. Der Befehl tty liefert dir diesen Namen:

tty
/dev/pts/1

In dem Fall müsstest Du also nach /dev/pts/1 umleiten. Ein Miniskript würde also z.B. so aussehen:

#!/bin/bash
echo "HALLO WELT" \> /dev/pts/1
exit 0

Dann erscheint „HALLO WELT“ auf dem Terminal…

(und solange da lassen, bis der User es Quittiert hat)

aber welchen Sinn soll das haben? Das ist mindestens sehr Linux-unüblich, solche still im Hintergrund laufenden Skripte „quittieren“ zu wollen. Aber das habe ich weiter oben auch schon angefragt.
Denkbar wäre es eventuell, eine Ausgabe in eine Logdatei umzuleiten und das Skript schickt dir dann diese Logdatei per Mail.

Viele Grüße
Marvin

Sinn der ganzen Aktion ist es, dass wir einen Rechner auf Linux haben wollen, in den die User ihre USB sticks stecken können und die Info bekommen, ob er Virenfrei ist oder nicht.
Dazu habe ich clamav installiert und das funktioniert auch alles soweit. Wenn ich das Script manuell aufrufe ist es so wie ich es möchte.
Vielleicht kennst Du ja ne elegantere Lösung?

Hallo 151kg,

Sinn der ganzen Aktion ist es, dass wir einen Rechner auf
Linux haben wollen, in den die User ihre USB sticks stecken
können und die Info bekommen, ob er Virenfrei ist oder nicht.

Gut, jetzt wird es langsam klarer…

Wenn ich das Script manuell aufrufe ist es so
wie ich es möchte.
Vielleicht kennst Du ja ne elegantere Lösung?

Dazu müsste ich wissen, wie dein Skript überhaupt aussieht :wink: Aber so als Denkanstoß, clamav liefert ja, wie jedes Programm einen Returncode:
0 = Keinen Virus gefunden
1 = Virus(e) gefunden
2 = Sonstige Fehler
usw. (steht irgendwo in der Doku, habe ich jetzt auf die Schnelle nicht da)
Diese Codes stehen in $? zur Verfügung und können weiterverarbeitet werden. Ein simples Beispiel:

kb@lenny:~$ ls -l 01.pdf
-rw-r--r-- 1 kb kb 87808 5. Jul 2009 01.pdf
kb@lenny:~$ echo $?
0
kb@lenny:~$ ls -l 02.pdf
ls: Zugriff auf 02.pdf nicht möglich: Datei oder Verzeichnis nicht gefunden
kb@lenny:~$ echo $?
2

Das erste Mal ist $? = 0, weil die Dateiattribute gelesen werden konnten, beim zweiten Mal $? = 2, weil es eben keine Datei 02.pdf gibt.
Diesen Returncode könntest Du z.B. im Skript wie schon erläutert in eine Log-Datei umleiten. Diese Log-Datei wird dann von einem Skript außerhalb, das als Dämon ständig im Hintergrund läuft (entspricht in etwa den Windows-Diensten) auf Schreibvorgänge überwacht und ausgewertet. Bei Änderungen wird von diesem zweiten Skript eine passende Meldung auf das Terminal geschickt.
Ist etwas umständlich, wenn auch nicht ganz so sehr, wie es klingt, aber durchaus machbar.
Zweite Lösung:
Du verzichtest auf den Automatismus, bzw reduzierst das aufs automatische mounten des USB-Sticks und bietest z.B. per PHP eine Webseite an, mit einer Schaltfläche „Zur Prüfung hier klicken“ und auf der Webseite wird dann auch das Resultat ausgegeben. Ansätze dafür finden sich z.B. hier:
http://www.steffen-ille.de/misc/php5-clamav.php
Das ist das, was mir jetzt so auf Anhieb einfällt. Beim genaueren Studium von clamav wäre sich noch anderes denkbar, aber dazu fehlt mir im Moment die Zeit und auch etwas die Lust.

Viele Grüße
Marvin