USB प्रविष्टि पर स्क्रिप्ट चलाने के लिए udev नियमों का उपयोग करना


17

मैं एक USB डिवाइस में प्लग इन करने के लिए हर बार चलाने के लिए स्क्रिप्ट सेट करने का प्रयास कर रहा हूं। मैंने फ़ाइल /etc/udev/rules.d/90-local.rules बनाया और निम्नलिखित नियम जोड़ा:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

समस्या यह है कि जब ड्राइव जुड़ा होता है, तो कुछ भी नहीं होता है। डिबगिंग उद्देश्यों के लिए स्क्रिप्ट, सूचना-भेजने के साथ एक अधिसूचना भेजने के लिए धांधली है, जो स्थापित है और टर्मिनल से ठीक काम करता है।

स्क्रिप्ट का रास्ता सही है, क्योंकि मैंने बिना किसी परेशानी के उस सटीक कमांड को टर्मिनल में चलाया है।


क्या आपका एंटीवायरस चल रहा है? यह व्यवहार है जो एवी कार्यक्रमों की किसी भी संख्या से कार्रवाई को गति देगा। हालाँकि मुझे चेतावनी की उम्मीद है, यदि आपने सूचनाएं अक्षम कर दी हैं, तो आप लॉग में छोड़कर इसे नहीं देख सकते। मैं इंटरनेट को अक्षम करने की सिफारिश करूंगा, फिर आपका एवी प्रोग्राम, इसे फिर से कोशिश कर रहा है।
ज़ैनबाइक

बिना किसी एवी के साथ उबंटू 11.04 रनिंग।
जेटी

@zenbike: कस्टम udev नियम जोड़ने से एंटीवायरस प्रोग्राम ट्रिगर क्यों होगा?
user1686

डिवाइस प्रविष्टि पर किसी भी स्क्रिप्ट को शुरू करने से हटाने योग्य उपकरणों को स्कैन करने के लिए एवी सेट में झूठी सकारात्मकता पैदा हो सकती है। क्यों, मुझे नहीं पता। यह मेरे साथ एक थंबड्राइव और एवीरा एवी पर एक कारखाने में स्थापित स्क्रिप्ट के साथ हुआ, मुझे पता है।
ज़ेनबाइक

जवाबों:


6

मुझे भी यही समस्या थी। यह मेरे लिए काम किया:

अपनी स्क्रिप्ट को कॉपी करने /usr/local/binऔर अपनी .rulesफ़ाइल में निर्देशिका बदलने का प्रयास करें ।

इसके अलावा, मुझे नहीं पता कि SYSFS क्या है, लेकिन मैं एटीटीआर गुणों का उपयोग करना पसंद करूंगा।

निम्न पंक्ति मेरी .rulesफ़ाइल की सामग्री है :

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"

ATTRS{vendor}=="SanDisk "बात यह है कि इसका मतलब है कि केवल करता है Sandiskपता लगाया जाएगा?
ब्लेड 19899

7

notify-send आपके DBus सत्र बस तक पहुँच की आवश्यकता होती है, जिसके दो कारण नहीं हो सकते हैं:

  • सत्र के बारे में कोई जानकारी नहीं। जब udev द्वारा शुरू किया गया था, तो आपकी स्क्रिप्ट कुछ भी नहीं जानती है कि आप कहाँ लॉग इन हैं या यदि आप लॉग इन हैं। X11 के साथ मल्टी-सीट अभी भी मुश्किल है, लेकिन उपयोगकर्ता स्विचिंग X11 और कंसोल सत्र दोनों के लिए काम करता है। कई लोग नेटवर्क पर SSH, VNC और NX का भी उपयोग करते हैं।

    ( DISPLAY=:0समय का आधा काम करेगा, लेकिन यह अभी भी सबसे अच्छा अनुमान लगा रहा है।)

  • DBus नीति द्वारा अस्वीकृत। यहां तक ​​कि अगर आपकी स्क्रिप्ट किसी भी तरह आपके X11 सत्र को ढूंढती है, तो यह rootआपके उपयोगकर्ता खाते के बजाय स्क्रिप्ट के चलते सूचनाएं भेजने में सक्षम नहीं होगी ।


2
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;अधिसूचित-भेजने के साथ मेरे लिए चाल
चली

1

आप इसके बजाय विक्रेता और उत्पाद ID से डिवाइस का मिलान करने का प्रयास कर सकते हैं। निम्नलिखित कस्टम नियम मेरे लिए काम करता है:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

आप उपकरण संलग्न करने के बाद lsusb आउटपुट या dmesg में idVendor और idProduct देख सकते हैं।


मैंने कोशिश की है, और यह भी काम नहीं किया ... (ATTR {idProduct} == "5530") ... क्या विक्रेता की भी आवश्यकता है? मुझे ऐसा नहीं लगता ...
JTeK

उस स्थिति में समस्या स्क्रिप्ट के साथ ही हो सकती है। उदाहरण के लिए यह $ PATH env वैरिएबल पर निर्भर हो सकता है। परीक्षण के लिए इसे निर्यात PATH = '' की तरह चलाने का प्रयास करें; /home/jesse/Documents/Scripts/cruzer.sh
आलेह

1

एलेह के उत्तर पर निम्नलिखित: यदि आप भी removeघटनाओं की निगरानी करना चाहते हैं, तो आपको नाम वाले पर्यावरण चर की तलाश करनी होगी ID_SERIAL। इसमें अंडरस्कोर द्वारा अलग किए गए विक्रेता और उत्पाद आईडी शामिल हैं:

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

नियम अब बहुत छोटा है।


0

शायद, आपको sleepUSB डिवाइस को "व्यवस्थित" करने का मौका देने के लिए स्क्रिप्ट के भीतर जोड़ना होगा ? उदाहरण के लिए, यूएसबी 3 जी मोडेम, मोड कर्नेल द्वारा चालू और चलने के लिए / dev / ttyUSB प्राप्त करने के लिए स्विचिंग।


0

SUBSYSTEM = "usb" के साथ SUBSYSTEM = "usb" को बदलने का प्रयास करें


नहीं, SUBSYSTEM=="usb"बस ठीक है।
krlmlr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.