Skript beim einstecken eines USB-Geräts ausführen?

H

hulahub

Aktives Mitglied
Thread Starter
Dabei seit
18.12.2004
Beiträge
106
Reaktionspunkte
4
Hallo,

ich würde gerne unter Snow Leopard ein Skript ausführen sobald ein (bestimmtes) Gerät via USB verbunden wird.
Ein einfaches Beispiel wäre das Mounten einer TrueCrypt Partition beim einstecken der Festplatte.

Das es gehen kann zeigt Carbon Copy Cloner. Dieses startet z.B. ein Backup sobald ein Volumen eingehangen wird. Wie stellt es das fest? Gibt es eine Möglichkeit als Nutzer auch auf einen solchen Event zu reagieren?

Vielen Dank!
 
müsste an sich über eine folder action gehen.
oder ein launchd job mit watch folder...
 
"Folder Action" hört sich erstmal nicht geeignet an. Was ist z.B. wenn das Gerät noch kein "Folder" ist da es nicht "mountbar" ist? Beispiel TrueCrypt oder z.B. auch eine USB Maus die ich anschließe.

Oder sehe ich das falsch?

PS. Warum in "Applescript und Automator"? Das macht für mich keinen Sinn - ich glaube nicht das es als Applescript zu realisieren ist und auf keinen Fall mittels Automator...
 
Hallo hulahub,

/Volumes ist ein Folder wenn auch unsichtbar und wenn Du die Platte ansteckst wird die da rein gemountet - also ändert sich da was und löst eine Aktion aus. Du musst nur vorher prüfen was sich ändert...

Folder Action und launchd job mit watch folder ist das selbe.

BTW wenn Du es eh besser weißt, warum fragst Du?

Gruß Andi
 
Warum in "Applescript und Automator"? Das macht für mich keinen Sinn
Wenn nicht mit AppleScript, wie sonst? ;)
Einige Beiträge im Forum zum Thema hier:
https://www.macuser.de/forum/f30/automator-dateien-automatisch-571699/
https://www.macuser.de/forum/f30/on-monunt-folder-254040/
https://www.macuser.de/forum/f30/beim-mounten-ext-296202/

Was ist z.B. wenn das Gerät noch kein "Folder" ist da es nicht "mountbar" ist?
Gute Frage :D
Bin kein Unix-Experte aber ich glaube, im device directory /dev/ sollten alle USB-Devices aufgelistet werden. Dieses Verzeichnis kannst Du mit einem AppleScript durcharbeiten, um nach dem Gerät zu suchen, das Dich interessiert.

Good scripting
Farid
 
/Volumes ist ein Folder wenn auch unsichtbar und wenn Du die Platte ansteckst wird die da rein gemountet - also ändert sich da was und löst eine Aktion aus. Du musst nur vorher prüfen was sich ändert...

Mir ist klar, dass es ein Folder ist. Aber eine USB-Maus oder nicht mountbare Dateisysteme wie z.B. eine ungemountete TrueCrypt-Partition erscheinen nicht in /Volumes.

chebfarid schrieb:
Bin kein Unix-Experte aber ich glaube, im device directory /dev/ sollten alle USB-Devices aufgelistet werden. Dieses Verzeichnis kannst Du mit einem AppleScript durcharbeiten, um nach dem Gerät zu suchen, das Dich interessiert.

Das ist richtig, da werden alle Geräte aufgelistet. Und wie erkenne ich eine Veränderung dort zeitnahe und effizient? Also wie überwache ich diesen "Ordner" (es ist ja ein virtuelles Dateisystem)...


Danke schonmal und viele Grüße
 
was genau hast du denn vor?
du willst die truecrypt partition automatisch mounten?
das wird eh schwierig, weil truecrypt nicht scriptbar ist...
 
Z.B. soll er mich direkt zum Mounten der TrueCrypt-Partition auffordern (geht z.B. via "/Applications/TrueCrypt.app/Contents/MacOS/TrueCrypt --mount /dev/..."
 
Statt an /Volumes/ kann man vielleicht eine Ordneraktion an /dev/ anhängen, die checkt ob neue Devices dazugekommen sind und ob die Truecrypt-Partition darunter ist.

Ciao
Farid
 
Nein kann man leider nicht. Aber wenn ich wüsste wie ich ein Skript ausführen kann wenn das USB Gerät erkannt wird, dann würde es das Problem ja lösen... ;)

Grüße
 
Hallo hulahub,

eventuell kann es dieses Tool

Gruß Andi
 
  • Gefällt mir
Reaktionen: msg
Danke schonmal.

Aber müsste ich das nicht von der Geräte UUID abhängig machen? Ich habe mehrere USB Festplatten und nicht jede hat auf einer Partition ein TrueCrypt Image... Die /dev/rdisk* namen sind aber unabhängig vom Gerät sondern hängen von der Anzahl und Reihenfolge der momentan eingehangenen Geräte ab, oder?
 
klar müsstest du das UUID abhängig machen, hat ja keinen sinn, das für alle USB platten zu machen...
 
Unter Linux waere udevinfo das Werkzeug meiner Wahl um an Infos zu kommen. Bei OS X kann man da evtl was IOKit reissen. Wenns nur um Speichergeraete geht koennte ja auch diskutil evtl was auswertbares ausgeben.
 
Hallo!

Ich verstehe gerade nur Bahnhof.
Eine Ordneraktion an /dev? Wo findet ihr denn diesen Ordner?
Und überhaupt... diskutil ... /dev ... wenn der USB Stick (oder die Partition darauf) nicht gemountet ist, dann gibt es dort auch keinen Eintrag, oder?

Und worum geht es eigentlich genau?
Man steckt einen Truecrypt-Verschlüsselten USB Stick in einen Port und statt ihn im nächsten Schritt zu mounten, soll was passieren? Eine Begrüßung a la "Mounte mich"? Oder etwa wirklich ein Script, welches den "von selber" mountet? :eek:

Ich sehe da kein sinnvollen Workflow. Weder über AppleScript noch launchd.
Aber eventuell stehe ich ja auch gerade nur auf dem Schlauch....

So, wie ich das sehe, wäre ein verschlüsselter Ordner auf dem Stick die einfachere Lösung.
Wenn es noch eine weitere unverschlüsselte Partition gibt und der Stick --an sich -- schon gemountet wird ... dann greift diskutil o.ä. zwar schon, nur kenne ich leider keine Möglichkeit, was auch immer zu überwachen.

Ein stay open Skript, welches schön die ganze Zeit im Hintergrund läuft, ist alles, was mir dazu einfällt.

Wenn der Stick nicht gemountet ist, gibt es auch kein Namen dieses Datenträgers.
Aber apropos I/O: Man kann mit ioreg die I/O Registry abfragen. Genauer den Produkt und/oder Anbieter Namen eines USB Sticks.

Auf der schönen hohabadu.de gibt es ein nettes Beispielskript

Code:
(*   ANWENDUNGS-BEISPIEL:   *)
USBDeviceCheck("Apple Optical USB Mouse")
-- Hier Gerätenamen übergeben, 
-- den du unter "über diesen Mac" unter "USB" findest
-- man könnte auch noch den Vendor abklopfen

-- :::::::::::::::::::::::::::::::::  hohabadu.de  :::::::::::::::::::::::::::::::::

-- result = "true" if the device exists, "false" if not
on USBDeviceCheck(ProductName)
	if ProductName is in (do shell script "ioreg -l | grep 'USB Product Name'") then
		return true
	else
		return false
	end if
end USBDeviceCheck

Anbietername wäre "USB Vendor Name"



Gruß
 
Und überhaupt... diskutil ... /dev ... wenn der USB Stick (oder die Partition darauf) nicht gemountet ist, dann gibt es dort auch keinen Eintrag, oder?
Man kann schon mit diskutil pruefen ob was anliegt und das dann weiter behandeln:
Code:
#!/usr/bin/env python
from plistlib import readPlistFromString as rPFS
from subprocess import *

def shell(cmd):
    return Popen(cmd.split(), stdout=PIPE).communicate()[0]

disks = {False: [], True: []}   
for disk in rPFS(shell('diskutil list -plist'))['WholeDisks']:
    disks[rPFS(shell('diskutil info -plist ' + disk))['Internal']].append(disk)

print "Internal disks: " + ' '.join(disks[True])    
print "External disks: " + ' '.join(disks[False])
Quelle: stackoverflow.com

Aber die Loesung ueber IO ist natuerlich wesentlich gradliniger.
 
Hallo!

Ok! Ich glaube, meine Verwirrung rührt daher, dass ich mich gar nicht mit Trucrypt verschlüsselten USB-Sticks auskenne :D
Danke für das Beispiel-Skript. Aber es listet doch auch nur die gemounteten Datenträger auf...


Gruß
 
Hier wär mal eine Idee von mir, bei der USB Geräte beim einstecken oder ausstecken erkannt und angezeigt werden. Das müsste sich für deine Zwecke sinnvoll erweitern lassen.

Code:
set old to do shell script "system_profiler SPUSBDataType"
set devList to every paragraph of old
set newdev to "0"
set devid to {}

repeat until newdev is in {"-1", "1"}
	delay 1
	set new to do shell script "system_profiler SPUSBDataType"
	set newList to every paragraph of new
	
	if the number of items in devList > number of items in newList then
		set newdev to "-1"
		
		repeat with n in devList
			if n is in devList and n is not in newList then
				set devid to devid & n as string
			end if
		end repeat
		
		--set devname to second item of devid as string
		display dialog devid
		
	else if the number of items in devList < number of items in newList then
		set newdev to "1"
		
		repeat with n in newList
			if n is in newList and n is not in devList then
				set devid to devid & n as string
			end if
		end repeat
		
		--set devname to first item of devid as string
		display dialog devid
		
	else if the number of items in devList = number of items in newList then
		delay 1
	end if
end repeat
 
Zurück
Oben Unten