Wie führe ich ein Shell-Skript aus, wenn ein neues USB-Speichergerät erkannt wird?

17

Ich möchte ein Skript, das das Protokoll speichert und es anmeldet, sobald ein USB-Massenspeicher angeschlossen ist (mit der Datei 'OKdump'). Und wenn etwas Ungewöhnliches (wie ein visuell vorhandener Fehler) erkannt wird, möchte ich dies es, um einen Screenshot aufzunehmen und auf demselben Laufwerk zu speichern.

Amith KK
quelle

Antworten:

13

Verwenden Sie Udev. Udev ist ein Geräte-Manager-Daemon. Es ist unter anderem für die Benennung Ihrer Geräte zuständig. Sie können udev-Regeln definieren, indem Sie Dateien mit einer bestimmten Syntax in das Regelverzeichnis einfügen. Die Regeln können viele Dinge tun - insbesondere können sie Skripte ausführen, wenn ein bestimmtes Gerät verbunden ist.

So lösen Sie Ihr Problem:

Zuerst müssen Sie Informationen auf Ihrem Gerät sammeln. Nehmen wir an, Sie haben es angeschlossen und wissen, dass es unter dem Namen läuft /dev/sdb1. Wenn ja:

udevadm info -a -p $(udevadm info -q path -n /dev/sdb1)

Der Befehl gibt Informationen zu Ihrem Gerät aus. Es ist ziemlich langwierig. Sie müssen etwas finden, das das Gerät eindeutig identifiziert. Das kann eine Seriennummer sein ATTRS{serial}=="UA04FLGC"oder eine Kombination aus anderen Attributen wie ATTRS{idVendor}und ATTRS{idProduct}. Die meisten Namen sind mehr oder weniger selbsterklärend. Wählen Sie eine oder mehrere, die Ihnen vernünftig erscheinen. Wenn sie nicht funktionieren, probieren Sie etwas anderes aus.

Wenn Sie eine eindeutige Kennung gefunden haben, erstellen Sie eine Datei /etc/udev/rules.d, die mit zwei Ziffern beginnt und mit endet .rules. Die beiden Ziffern geben die Reihenfolge an, in der diese .rules-Dateien verarbeitet werden. Dies 70-usb-log-custom.rulessollte eine gute Wahl für Sie sein. Die Syntax dieser Regeldatei kann sehr komplex sein. Wenn Sie interessiert sind, google udev. Öffnen Sie nicht einfach die neu erstellte Datei und bearbeiten Sie sie so, dass sie etwa so aussieht:

# /etc/udev/rules.d/70-usb-log-custom.rules

KERNEL=="sd?1", ATTRS{serial}=="UA04FLGC", ACTION=="add", SYMLINK+="cusb1", RUN+="/home/confus/bin/usb-encrypt.sh add %k"
ENV{ID_FS_USAGE}=="crypto", ACTION=="remove", RUN+="/home/confus/bin/usb-encrypt.sh remove %k"
SUBSYSTEM=="usb", SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c9f", GROUP="users", MODE="0666"

Dies ist eine aktuelle Udev-Datei, die ich verwende. Es gibt drei Regeln. Jede Zeile ist eine Regel für sich. In der ersten Zeile wird ein Skript ausgeführt, um ein entschlüsseltes Gerät zu erstellen, wenn eine verschlüsselte Festplatte angeschlossen ist. In der zweiten Zeile wird dasselbe Skript mit unterschiedlichen Optionen aufgerufen, falls das entschlüsselte Gerät entfernt wird. In der dritten Zeile werden Berechtigungen für ein anderes verwandtes Gerät festgelegt.

Wahrscheinlich brauchen Sie nur die erste Zeile. Löschen Sie den Rest und fügen Sie die richtige Seriennummer ein (oder eine Kombination von Parametern, die Sie ausgewählt haben, um Ihr Gerät zu identifizieren).

Erklärung meiner Akte:

KERNEL=="sd?1"sagt, dass das Gerät, nach dem wir in dieser Regel suchen /dev/sda1, so /dev/sdc1oder so ähnlich benannt ist. Das Fragezeichen ist ein Platzhalter für jeden Buchstaben. ATTRS{serial}=="UA04FLGC"ist hier die eindeutige Kennung. Für das andere Gerät, von dem ich gesprochen habe (dritte Zeile), verwende ich nicht die Seriennummer, sondern eine Kombination aus SYSFS{idVendor}=="1781"und SYSFS{idProduct}=="0c9f", um es zu identifizieren.

ACTION=="add"gibt die Regel an, dass nur dann gehandelt werden soll, wenn das Gerät hinzugefügt wird. nicht, wenn es entfernt wird.

SYMLINK+="cusb1"Erstellt einen Symlink zur Festplatte, unter dem man ihn finden kann /dev/cusb1.

RUN+="/home/confus/bin/usb-encrypt.sh add %k" Führt das Skript aus und übergibt ihm 'add' und '% k' (den Gerätenamen).

Ich werde nicht näher darauf eingehen, da es hervorragende Tutorials zu udev-Regeln gibt. Was Sie hier lesen, sollte jedoch ausreichen, um angestarrt zu werden.

verwechseln
quelle
Ausgezeichnete Antwort, aber ich möchte jetzt ein Skript, das die Protokollierung macht
Amith KK
4
Dann müssen SIE es schreiben oder präzisieren, was genau Sie wollen. ZB sehe ich nicht, was ein Screenshot Ihnen sagen würde. Auch "Dumps das Systemprotokoll" wohin? "Anything abnormal" ist ebenfalls ein ziemlich weit gefasster Begriff. Wir sind nicht Ihre persönliche Armee - wenn Sie sich mit Bash-Scripting auskennen, haben Sie jetzt alle Werkzeuge, die Sie benötigen, um das Script selbst zu schreiben.
con-f-use
: D sorry @ con-f-use
Amith KK