ubuntuusers.de

USB-Abfrage / Python

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

HP-Fan

Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Abend Leute,

Gibt es eine Möglichkeit, die USB-Anschlüsse mit der Hilfe von Python zu überwachen, und eine Programm-Reaktion aus zu lösen?

Ich habe ein Script, dass grafisch anzeigen soll, ob ein USB-Stick eingesteckt ist, oder nicht. Außerdem will ich verhindern, dass auf den USB-Stick geschrieben wird, wenn gar keiner eingesteckt ist.

Anders herum sollen auch keine Daten eingelesen werden können, wenn der Stick ausgesteckt ist.

Mein Python Programm muss also irgendwie an die Info kommen, ob USB-Stick anwesend, oder nicht.

Bei Windows lief früher so ein Watchdog-Programm - Ist das bei Linux/Ubuntu auch so? Eventuell stellt ja Ubuntu eine Art Pipe "|" zur Verfügung, von der man die Info bekommen kann? Mit dem "mount" Problem muss ich mich wahrscheinlich auch noch auseinander setzen - oder geht dieser Kelch an mir vorbei? 😬

Gruß HP-Fan

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

In Python kenne ich mich leider nicht aus, aber ich denke du kannst dir mit udev helfen. Dort kann bspw. dein Python-Script beim Einstecken eines (bestimmten) USB-Sticks ausgeführt werden.

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Hallo

udev sieht gut aus. Werde mich einlesen - Danke und Gute Nacht.

Gruß HP-Fan

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

HP-Fan schrieb:

Außerdem will ich verhindern, dass auf den USB-Stick geschrieben wird, wenn gar keiner eingesteckt ist.

Das brauchst Du nicht verhindern, das geht von selbst nicht. ☺

Anders herum sollen auch keine Daten eingelesen werden können, wenn der Stick ausgesteckt ist.

Auch hier ist das sowieso schon nicht möglich. ☺

Mein Python Programm muss also irgendwie an die Info kommen, ob USB-Stick anwesend, oder nicht.

Ein bestimmter? Ein beliebiger? Was ist mit 3 Sticks bei 7 Anschlüssen?

Bei Windows lief früher so ein Watchdog-Programm - Ist das bei Linux/Ubuntu auch so? Eventuell stellt ja Ubuntu eine Art Pipe "|" zur Verfügung, von der man die Info bekommen kann? Mit dem "mount" Problem muss ich mich wahrscheinlich auch noch auseinander setzen - oder geht dieser Kelch an mir vorbei? 😬

Du kannst auch /etc/mtab auslesen. Das ist die Tabelle gemounteter Dateisysteme. Auf einem Stick können auch mehrere sein.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11248

Wohnort: München

Es gibt mit pyudev ein nettes libudev-Binding für Python: https://pyudev.readthedocs.io/en/latest/ Damit kannst du u.a. gefiltert nach Geräte-Attributen auf Events reagieren.

Da das eigentliche Kriterium vermutlich eher der Mount des Dateisystems auf dem Stick ist (es sei denn du schreibst direkt auf das Block Device) und nicht allein die physische Anwesenheit des Sticks, könnte man sich auch überlegen sich über DBus an udisks2 zu hängen: http://storaged.org/doc/udisks2-api/2.7.0/ - oder man nimmt einen fertigen Wrapper: http://lazka.github.io/pgi-docs/index.html#UDisks-2.0

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Morgen Leute - man ist hier schon viel los ☺

Ich glaube ich muss noch ein paar Infos nachreichen: Aktuell entwickle ich das Python-Program auf diesem System (siehe oben). Dieser Rechner hat hinten 4 und vorne 2 USB-Buchsen. Ziel ist es, das fertige Programm am Ende zu so zu kompilieren, dass es auf dem Raspberry PI3 läuft. Der hat nämlich 4 USB-Anschlüsse. Daraus folgt also, dass ich eine Methode wählen sollte, die auch nach dem Kompilieren des Pyton-Scriptes auf dem Raspi funktioniert. Da ist ab Werk das OS-Noobs vorinstalliert und Raspian ist auch vorhanden.

Unten im Anhang habe ich eine Maske des Python-Programmes, um das es gehen soll. Das Bild des USB-Sticks (auf dem Bild gerade Aktiv), soll je nach dem, ob ein USB-Stick steckt aktualisiert werden. Das kann ich aber nur, wenn ein eine Statusinfo habe, was am USB-Steckplatz gerade los ist.

Ein bestimmter? Ein beliebiger? Was ist mit 3 Sticks bei 7 Anschlüssen?

user_unkown's Einwand ist berechtigt und er hat damit den Nagel auf den Kopf getroffen. Prinzipiell wäre es mir egal, in welchem Port der USB-Stick eingesteckt wurde. Allerdings interessieren USB-Keyboard und USB-Mäuse nicht. Die Meldung soll also nur bei vorhandenem Massenspeicher kommen. Und was passiert, wenn ein User 2 USB Sticks gleichzeitig einsteckt? Gut, die zum Schluß gennante Problematik könnte ich umgehen, indem ich die verbleibenden USB-Buchsen mechanisch sperre ... ← Nicht schön aber selten! 😀

Gruß HP-Fan

Bilder

curly

Anmeldungsdatum:
2. Mai 2010

Beiträge: 268

user_unknown schrieb:

HP-Fan schrieb:

Außerdem will ich verhindern, dass auf den USB-Stick geschrieben wird, wenn gar keiner eingesteckt ist.

Das brauchst Du nicht verhindern, das geht von selbst nicht. ☺

Anders herum sollen auch keine Daten eingelesen werden können, wenn der Stick ausgesteckt ist.

Auch hier ist das sowieso schon nicht möglich. ☺

ymmd 🤣

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6494

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Hallo

Alles klar - Danke an alle Mitwirkenden.

HP-Fan

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Abend Leute

Ich muss nochmal ran an das USB Problem...

Wenn ich in Python...

1
2
import os
os.system("lsusb")

...eingebe, dann bekomme ich im Terminal eine Ausgabe über alle USB-Geräte. Kann ich in Python diese Daten in einen String/Variable packen?

Gruß HP-Fan

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6494

bin kein Programmier. Aber: Mit "=" ?

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Abend BillMaier

Das

1
os.system("lsusb")

ist ein Terminal-Befehl. Folglich ist die Ausgabe auch im Terminal. Und ich komme da leider nicht mit meinem Python dran... 😢

Naja, wer suchet, der findet... also suche ich mal weiter...

Gruß HP-Fan

apt-ghetto

Anmeldungsdatum:
3. Juni 2014

Beiträge: 2943

API

Als Rückgabewert gibt os.system den Exitstatus zurück.

So etwas wie

1
2
3
import subprocess
output = subprocess.check_output("lsusb")
print(output)

sollte deinem Anliegen näher kommen. Aber da können dir richtige Python-Programmierer eher weiter helfen als ich.

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Hallo

@apt-ghetto Damit habe ich das in einer Variable und kann mit Zeichenketten-Operatoren die für mich wichtigen Informationen ziehen - Super!!!

1000 - Dank 👍

HP-Fan

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Ziel ist es, das fertige Programm am Ende zu so zu kompilieren

Python Programme werden nicht kompiliert...

Die Anzahl der USB-Buchsen ist egal - Linux handhabt das anders als Windows, wo je nach USB-Buchse ggf ein anderer Laufwerksbuchstabe zugewiesen wird. Linux zwar auch durch, aber anders.

Wenn es DER USB-Stick ist, also immer ein bestimmter, dann würde ich den auch per udev-Regel erkennen lassen und dann immer auf einen spezifischen Pfad mounten. Wenn es EIN USB-Stick ist, ist das schwieriger...

Und vergiß' einfach, dass es os.system() gibt. Das ist veraltet - steht sogar in der offiziellen Python-Doku - und benutze statt dessen das subprocess Modul.

Gruß, noisefloor

Antworten |