udev 규칙을 사용하여 USB 삽입시 스크립트 실행


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"

문제는 드라이브가 연결 되어도 아무 일도 일어나지 않는다는 것입니다. 디버깅 목적으로이 스크립트는 통지 전송과 함께 알림을 보내도록 조작되어 설치되어 터미널에서 제대로 작동합니다.

문제없이 터미널에서 정확한 명령을 실행했기 때문에 스크립트 경로가 정확합니다.


안티 바이러스가 실행 중입니까? 이것은 여러 AV 프로그램에서 작업을 트리거하는 동작입니다. 경고 메시지가 표시되지만 알림을 비활성화하면 로그를 제외하고는 알림이 표시되지 않을 수 있습니다. 인터넷을 비활성화 한 다음 AV 프로그램을 다시 시도하는 것이 좋습니다.
zenbike

AV가 설치되지 않은 상태에서 Ubuntu 11.04를 실행 중입니다.
JTeK

@zenbike : 왜 사용자 정의 udev 규칙을 추가하면 안티 바이러스 프로그램이 트리거됩니까?
user1686

장치 삽입시 스크립트를 시작하면 AV 세트에서 오탐 (false positive)이 발생하여 이동식 장치를 스캔 할 수 있습니다. 왜 모르겠어요 썸 드라이브와 Avira AV에서 출하시 설치된 스크립트를 사용하면 문제가 발생합니다.
zenbike

답변:


6

나는 같은 문제가 있었다. 이것은 나를 위해 일했다 :

스크립트를 복사 /usr/local/bin하여 .rules파일 의 디렉토리를 변경 하십시오.

또한 SYSFS가 무엇인지 모르지만 ATTR 속성을 사용하는 것을 선호합니다.

다음 줄은 내 .rules파일 의 내용입니다 .

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

ATTRS{vendor}=="SanDisk "부분 만 Sandisk감지 될 것입니까?
blade19899

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;notify-send와 함께 나를 위해 속임수를했다
mlt

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 변수에 따라 달라질 수 있습니다. 테스트하려면 export PATH = ''와 같이 실행하십시오. /home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

Aleh의 답변에 대한 후속 조치 : remove이벤트 도 모니터링 하려면이라는 환경 변수를 찾아야합니다 ID_SERIAL. 밑줄로 구분 된 공급 업체 및 제품 ID가 포함됩니다.

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

이제 규칙도 짧아졌습니다.


0

아마도, sleepUSB 장치에 "정착"할 수있는 기회를주기 위해 스크립트 내에 를 추가해야 합니까? 예를 들어, USB 3g 모뎀, / dev / ttyUSB를 얻기 위해 모드를 전환하여 커널에 의해 시작되고 실행됩니다.


0

SUBSYSTEM = "usb"를 SUBSYSTEMS = "usb"로 바꾸십시오.


아냐, SUBSYSTEM=="usb"괜찮아
krlmlr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.