Sử dụng quy tắc udev để chạy tập lệnh khi chèn USB


17

Tôi đang cố gắng thiết lập một tập lệnh để chạy mỗi lần tôi cắm thiết bị USB. Tôi đã tạo tệp /etc/udev/rules.d/90-local.rules và thêm quy tắc sau:

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

Vấn đề là khi ổ đĩa được kết nối, không có gì xảy ra. Kịch bản, với mục đích gỡ lỗi, được cài đặt để gửi thông báo với thông báo gửi, được cài đặt và hoạt động tốt từ thiết bị đầu cuối.

Đường dẫn đến tập lệnh là chính xác, vì tôi đã chạy lệnh chính xác đó trong thiết bị đầu cuối mà không gặp rắc rối nào.


Là phần mềm chống vi-rút của bạn đang chạy? Đây là hành vi sẽ kích hoạt hành động từ bất kỳ số lượng chương trình AV. Mặc dù tôi mong đợi một cảnh báo, nếu bạn đã tắt thông báo, bạn có thể không thấy nó ngoại trừ trong nhật ký. Tôi khuyên bạn nên vô hiệu hóa internet, sau đó là chương trình AV của bạn, thử lại lần nữa.
zenbike

Chạy Ubuntu 11.04 không cài đặt AV.
JTeK

@zenbike: Tại sao việc thêm quy tắc udev tùy chỉnh sẽ kích hoạt chương trình chống vi-rút?
dùng1686

Bắt đầu bất kỳ tập lệnh nào khi chèn thiết bị có thể gây ra lỗi tích cực trong bộ AV để quét các thiết bị di động. Tại sao, tôi không biết. Điều đó đã xảy ra với tôi với một kịch bản được cài đặt tại nhà máy trên ngón tay cái và Avira AV, tôi biết.
zenbike

Câu trả lời:


6

Tôi đã từng gặp vấn đề tương tự. Điều này làm việc cho tôi:

Cố gắng sao chép tập lệnh của bạn vào /usr/local/binvà thay đổi thư mục trong .rulestệp của bạn .

Ngoài ra, tôi không biết SYSFS là gì, nhưng tôi thích sử dụng các thuộc tính ATTR.

Dòng sau đây là nội dung của .rulestập tin của tôi :

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

các ATTRS{vendor}=="SanDisk "phần đó có nghĩa là chỉ Sandisksẽ được phát hiện?
lưỡi19899

7

notify-send yêu cầu quyền truy cập vào bus phiên DBus của bạn, điều này không thể có vì hai lý do:

  • Không có thông tin về phiên họp. Khi được bắt đầu bởi udev, tập lệnh của bạn không biết về nơi bạn đăng nhập hoặc nếu bạn đã đăng nhập. Nhiều chỗ ngồi với X11 vẫn còn khó khăn, nhưng chuyển đổi người dùng hoạt động cho cả phiên X11 và bảng điều khiển. Nhiều người cũng sử dụng SSH, VNC và NX qua mạng.

    ( DISPLAY=:0sẽ làm việc một nửa thời gian, nhưng điều đó vẫn đoán tốt nhất.)

  • Bị từ chối bởi chính sách của DBus. Ngay cả khi tập lệnh của bạn bằng cách nào đó tìm thấy phiên X11 của bạn, nó sẽ không thể gửi thông báo do tập lệnh được chạy rootthay vì tài khoản người dùng của bạn.


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;đã lừa tôi với thông báo-gửi
mlt

1

Thay vào đó, bạn có thể thử kết hợp thiết bị theo ID nhà cung cấp và sản phẩm. Quy tắc tùy chỉnh sau đây hoạt động với tôi:

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

Bạn có thể thấy idVendor và idSản phẩm trong đầu ra lsusb hoặc dmesg sau khi gắn thiết bị.


Tôi đã thử điều đó và nó cũng không hoạt động ... (ATTR {idSản phẩm} == "5530") ... nhà cung cấp cũng được yêu cầu phải không? Tôi sẽ không nghĩ như vậy ...
JTeK

Trong trường hợp đó, vấn đề có thể là do chính kịch bản. Ví dụ, nó có thể phụ thuộc vào biến env $ PATH. Đối với thử nghiệm, hãy thử chạy nó như xuất PATH = ''; /home/jesse/Document/Scripts/cruzer.sh
Aleh

1

Theo dõi câu trả lời của Aleh: Nếu bạn cũng muốn theo dõi removecác sự kiện, bạn cần tìm một biến môi trường có tên ID_SERIAL. Nó chứa ID nhà cung cấp và sản phẩm được phân tách bằng dấu gạch dưới:

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

Quy tắc bây giờ cũng ngắn hơn.


0

Có lẽ, bạn có thể cần phải thêm một sleeptập lệnh, để cho thiết bị usb có cơ hội "giải quyết"? Ví dụ, modem usb 3g, chuyển đổi chế độ để có được / dev / ttyUSB để được khởi động và chạy bởi kernel.


0

Hãy thử thay thế SUBSYSTEM = "usb" bằng SUBSYSTEMS = "usb"


Không, SUBSYSTEM=="usb"chỉ là tốt thôi.
krlmlr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.