Bir USB aygıtı taktığımda kabuk komut dosyası nasıl çalıştırabilirim

ergün elvan bilsel
Ankara Bilişimciler Platformu
3 min readFeb 17, 2022

Genellikle, bilgisayarınıza bir USB sürücü (E-imza, USB disk) bağlarken işleri otomatikleştirmek isteyebilirsiniz. Bu tip işlemler için “udev” servisine kural yazarak kolayca istediğimiz kabuk betiklerini çalıştırabiliriz.

Bu işlem için bize gerekli olan üç şey;

  • USB aygıta özel bir kural yazacağımızdan usb aygıtın vendor id (vid) ve product id (pid) bilgileri.
  • Kural (udev rules’a eklenecek)
  • Betik (kabukta çalışacak)

USB satıcı kimlikleri (VID) ve ürün kimlikleri(veya model id ) (PID), USB aygıtlarını bir bilgisayara veya başka bir ana bilgisayara tanımlamak için kullanılan 16 bitlik sayılardır. Her satıcı kimliği, USB Implementers Forum tarafından belirli bir şirkete atanır ve bu şirket de ayrı ürünlere bir PID atar. VID ve PID daha sonra ürüne gömülür ve satıcıyı ve ürünü açıklayan metin dizeleri ve cihaz tarafından desteklenen iletişim protokolleri hakkında ek tanımlayıcılarla birlikte cihaz takıldığında bilgisayara iletilir.

PID( Model ID) ve VID Değeri

lsusb

Yukarıda “lsusb” komutunun çıktısını görmektesiniz. Bus 0001 Device 007 aygıtının;

  • Vendor ID : ffff
  • Product ID (Model ID ) : 5678

olarak belirlenmiştir.

Peki bu usb aygıtının bizim yeni taktığımız usb aygıtı olduğunu nereden anladık? Bu soruya farklı cevaplar olsada bu işin en kolay yöntemi…

udevadm monitor --environment --udev

Komutunu çalıştırdığımız andan itibaren device’ları dinlemeye alıyoruz.

ID_VENDOR_ID=ffff
ID_MODEL=ProductCode
ID_MODEL_ENC=ProductCode\x20\x20\x20\x20\x20
ID_MODEL_ID=5678

Kural Ekleme

99-test.rules isminde bir kural oluşturuyoruz.

vi /etc/udev/rules.d/99-test.rules

USB Bellek sisteme eklendiğinde bir uyarı atacağız.

ACTION=="add",  ENV{ID_VENDOR_ID}=="ffff", ENV{ID_MODEL_ID}=="5678", RUN+="/usr/local/bin/test"

Aygıtın sisteme eklenme işlemi sırasında tetikleneceği için action’nın add parametresi kullandık. Ayrıca ;

  • remove
  • change

parametreleri mevcuttur.

Kuralımızı elimizde bulunan usb bellek vendor ve model id leri ile özelleştirdik. Aynı marka ve model bir usb daha takılır ise kabuk tetikleme işlemi gerçekleşecektir. Daha fazla ortam değişkeni kullanarak sadece tek bir usb disk üzerinde özelleştirme yapmanız mümkündür.

RUN+= çalıştıracağımız betiğin yolunu gösteriyoruz.

Operatörler için man dosyasını okuyabilirsiniz.

"=="
Compare for equality. (The specified key has the specified
value.)

"!="
Compare for inequality. (The specified key doesn't have the
specified value, or the specified key is not present at all.)

"="
Assign a value to a key. Keys that represent a list are reset
and only this single value is assigned.

"+="
Add the value to a key that holds a list of entries.

"-="
Remove the value from a key that holds a list of entries.

":="
Assign a value to a key finally; disallow any later changes.

UDEV servisi üzerinden tetiklenen betikler “root” profili ve yetkileri ile çalışmaktadır.

Bu yüzden ben oturum açtığım kullanıcı ekranında görmek istediğim için oturum açtığım kullanıcı kabuğunda betiğimi çalıştıracak şekilde düzenliyorum.

vi /usr/local/bin/test

Son olarak yeni yazdığımız betiğe çalıştırma yetkisi veriyoruz ve (yeni eklediğimiz ) udev kurallarını sistemin okuyabilmesi reload işlemini gerçekleştiriyoruz.

chmod +x /usr/local/bin/test && udevadm control --reload

Test

--

--