Skript reagující na vložení USB disku

ondro

Skript reagující na vložení USB disku
« kdy: 17. 01. 2012, 11:04:20 »
mam program, ktory potrebujem spustit az ked sa v systeme objavi usb disk. Je to specialny disk, ktory sa objavi v systeme az po zhruba minute po jeho zapojeni do usb portu. Potrebujem disiahnut to aby skript kontroloval, ci uz sa v systeme dany disk objavil. Ak nie, vypisat hlasku "prosim cakajte..." a tak dookola kontrolovat kym sa dany disk v systeme neobjavi. Ak sa objavi spust program alebo iny prikaz.
Nemam skusenosti so skriptovanim a zatial mi vychadza pouzitie cyklu while alebo until ale neviem ako donho zapracovat aby napriklad kontroloval vystup z prikazu lsscsi (alebo inac kontroloval, ci sa v systeme objavil). Pokial je vystup prazdny, tak vypis text, ak sa nieco na vystupe objavilo spust program.
Staci ma nasmerovat, nemam problem si to nastudovat. Na internete som zatial nenasiel ako by bolo toto riesitelne. V prikladoch pri while su skoro vzdy uvadadze priklady, ktore riesia uplne ine veci. Zaujima ako do while zakomponovat lsscsi alebo iny prikaz, ktory mi zisti pritomnost usb kluca.

udev a ine veci neprichadzaju v uvahu. Vecsinou potrebujem aby sa ten skript spustil po prihlaseni uzivatela na konzolu.

nieco taketo:
Kód: [Vybrat]
#!/bin/sh

while ( lsscsi ) ; do
  echo "Prosim cakajte ...."
  sleep 2
done

echo "funguje to"
« Poslední změna: 17. 01. 2012, 11:20:46 od Petr Krčmář »


Jozko

Re:Skript reagující na vložení USB disku
« Odpověď #1 kdy: 17. 01. 2012, 11:53:27 »
while :
do
    $(fdisk -l | grep '/dev/sdb' 1>/dev/null)  && { echo "USB najdeny" ; nejaky_prikaz; } || echo "Prosim cakajte ..."
    sleep 10
done

Franta

Re:Skript reagující na vložení USB disku
« Odpověď #2 kdy: 17. 01. 2012, 12:03:30 »
$ udisks --monitor
Monitoring activity from the disks daemon. Press Ctrl+C to cancel.
added:     /org/freedesktop/UDisks/devices/sdb
removed:   /org/freedesktop/UDisks/devices/sdb


Vypisuje události, ve chvíli, kdy se stanou – tzn. nepotřebuješ nějakou smyčku a periodickou kontrolu.

Re:Skript reagující na vložení USB disku
« Odpověď #3 kdy: 17. 01. 2012, 12:06:20 »
Stálo by za to, podívat se na lsusb a parsovat výstup z něj - něco takového:
Kód: [Vybrat]
lsusb | cut -c24-32 | grep -c "0a5c:2110"kde "0a5c:2110" je ID vašeho usb klíče (zjistíte ho přes samotné lsusb). Tento příkaz vrátí "1", pokud takové zařízení je připojeno.
Pokud to vezmu jako Jozko, pak
Kód: [Vybrat]
#/bin/bash
while [ `lsusb | cut -c24-32 | grep -c "0a5c:2111"`  -eq 0 ];do
        echo "wait..."
        sleep 10; # cekej 10 sekund
done
echo "nalezeno"

Jozkův kód by se nikdy nedostal ze smyčky a vyžaduje, aby šel USB klíč připojit jako disk pokaždé na stejné písmenko, což v praxi nelze (jednoduše pro uživatele) 100% zaručit.

Můj příklad bude fungovat i kdybyste jako "usb klíč" použil třeba usb myš.

Nevím ale, jestli lsusb nějak nezávisí na udev.


ondro

Re:Skript reagující na vložení USB disku
« Odpověď #4 kdy: 17. 01. 2012, 13:04:18 »
dakujem za reakcie. Naucil som sa zase nieoc noveho.
nevedel som ako ten test zapisat do while

to Jan Tulak :
to je to, co som potreboval. nevedel som ako postavit test a donho zakomponovat napr. lsscsi | grep  alebo  lsusb | grep .

Funguje to. Zaujimala by ma este jedna vec aku funkciu plni v danom skripte  cut -c24-32  lebo funguje to aj bez toho

Moj vypis lsusb obsahuje toto:
Kód: [Vybrat]
Bus 004 Device 001: ID 0000:0000 
Bus 001 Device 002: ID 03eb:2ffa Atmel Corp.
Bus 001 Device 001: ID 0000:0000 
Bus 003 Device 001: ID 0000:0000 
Bus 005 Device 001: ID 0000:0000 
Bus 002 Device 001: ID 0000:0000

v danom pouziti nebude nikdy ine zariadenie na usb zavesene, takze staci, co najjednoduchsia kontrola.

Este raz dakujme


NotFound

Re:Skript reagující na vložení USB disku
« Odpověď #5 kdy: 17. 01. 2012, 13:26:33 »
cut -c24-32 ořeže řádek z grepu jen na 24. až 32. znak

Re:Skript reagující na vložení USB disku
« Odpověď #6 kdy: 17. 01. 2012, 13:35:40 »
Ja to riesim cez udev.

cat /etc/udev/rules.d/99-backup-disk.rules
SUBSYSTEMS=="usb", KERNEL=="sd??", ACTION=="add", RUN+="/etc/msk-scripts/syncbackup2externaldisk"

Jozko

Re:Skript reagující na vložení USB disku
« Odpověď #7 kdy: 18. 01. 2012, 11:11:11 »
Jo zabudol som tam nacpat break.

'cut -c24-32' vypise 24. az 32. znak (aj medzera je znak)

Priklad:
echo "Bus 001 Device 002: ID 03eb:2ffa" | cut -c24-32
- vypise: 03eb:2ffa
echo "Bus 001 Device 002: ID 03eb:2ffa" | cut -c5-7
- vypise 001

Re:Skript reagující na vložení USB disku
« Odpověď #8 kdy: 18. 01. 2012, 12:08:59 »
V tomto případě je cut celkem zbytečné (nehrozí, že by se ten řetězec objevil třeba v názvu zařízení), ale jsem zvyklý si osekávat porovnávané údaje jak to jde, abych se vyhnul případné chybě, kdy se mi tam zamíchá něco jiného...  :)
Jak už bylo řečeno, cut je tam proto, aby se porovnávaly pouze řetězce s ID, nikoliv už ten zbytek řádku.

PS: Udělal jsem jednoduchý test časové náročnosti variant s a bez cut, vícenásobné opakování přinášelo podobný rozdíl (rozdíl v celkovém čase kolísal tak nějak mezi 70-90ms)
Kód: [Vybrat]
$ time for i in {1..100}; do lsusb |grep "03eb:2ffa"; done
real 0m4.545s
user 0m4.109s
sys 0m0.410s

$ time for i in {1..100}; do lsusb | cut -c24-32|grep "03eb:2ffa"; done
real 0m4.611s
user 0m4.187s
sys 0m0.483s


Cut tedy představuje mírné zpomalení (necelou milisekundu) - sice asi o něco urychlí běh grepu, ale ne o tolik, aby se to vyplatilo.