특정 플래시 드라이브가 마운트 될 때 스크립트를 실행하는 방법은 무엇입니까?


46

특정 USB 장치가 마운트 될 때 스크립트를 실행하는 방법이 있습니까?

비디오를 별도의 USB에 보관하고 USB 장치의 비디오 폴더를 홈 폴더의 비디오 폴더에 마운트하는 스크립트를 실행하고 싶습니다.

답변:


31

systemd 에는 훨씬 좋은 솔루션이 있습니다. 미디어에 의존하고 원하는 서비스를 작성합니다. 예 :/etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

그런 다음 서비스를 시작 / 활성화해야합니다.
sudo systemctl start your.service
sudo systemctl enable your.service

마운트 후 systemd는 트리거 스크립트를 시작합니다. udev 규칙에 비해 장점은 시스템 장치를 추가 한 후가 아니라 마운트 후에 스크립트가 실제로 실행된다는 것입니다.

사용 사례 : 자동 백업하려는 암호화 된 파티션이 있습니다. 장치를 추가 한 후 암호를 입력해야합니다. 백업 스크립트를 udev에 연결하면 암호를 입력 할 때 스크립트가 실행을 시도하는데 실패합니다.

리소스 : udev를 사용한 스크립팅

참고 : 다음 과 같은 장치 장치를 찾을 수 있습니다.systemctl list-units -t mount


2016 년 4 월이 다가 오길 바랍니다. 다음 Ubuntu LTS는 시스템이 활성화되었습니다. AFAIK의 위의 멋진 솔루션에는 Ubuntu 15.04 이상이 필요합니다.
guettli

오, 나는 systemd가 이미 우분투에 있다고 생각했습니다. 나는 실제로 데비안 스트레치 ;-)를 실행하고 있습니다
sumid

@sumid ~ / .config / systemd 아래에 넣으려면 작동합니까?
Khurshid Alam

4
큰! 데비안 제시에서 테스트했습니다. 서비스를 활성화하는 것을 잊지 마십시오 systemctl enable your.service. 스크립트 파일은 실행 가능해야합니다.
Corni

1
나를 위해, 이것은 실패합니다. 서비스를 시작하려고하면 "Unit media-bb.mount not found"라는 메시지가 표시됩니다. 엄지 드라이브 (FAT32) FS "bb"를 호출하여 이상한 문자가없고 너무 길거나 이와 비슷한 문자가 없는지 확인했습니다. 나는 노력 Requires=, After=그리고 WantedBy=모두와 선을 media-bb.mount그리고 media-BB.mount노틸러스 나 쇼 "BB"가 아닌 "BB"로 볼륨 때문이다. 대문자를 제외하고 동일한 오류 메시지. 뭐가 문제 야? 어떻게 든 그 media-<something>.mount서비스 를 만들어야 합니까?
UTF-8

29

에서 기기를 찾아 시작하십시오 lsusb. (예 : ID를 참고 0a81:0101)

/etc/udev/rules.d/via를 통해 새로운 udev 규칙 파일을 생성하고 sudoedit /etc/udev/rules.d/100-mount-videos.rules다음과 같이 새로운 규칙을 생성합니다 :

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

의 ID를 어떻게 사용했는지 참고하십시오 lsusb.

그런 다음 작업을 수행하기 위해 스크립트를 작성하면됩니다. 간단한 마운트 명령이 작동해야합니다. sleep 5파일 시스템이 초기화 될 때까지 기다릴 명령 이 필요할 수 있습니다 (주로 마운트하기 위해 gnome을 남겨 두는 경우 먼저 마운트 할 수 있으며 잠자기 상태가 필요하지 않을 수 있습니다).

Allan에서 추가 : 오래 실행되는 스크립트는 "이 장치 또는 종속 장치에 대한 모든 추가 이벤트"를 차단할 수 있습니다. My Mint 매뉴얼 페이지에 "오래 실행중인 작업을 이벤트 프로세스 자체에서 즉시 분리해야합니다." 이를 수행 할 수있는 기술에 대한 정보는 없습니다.

Oli의 답변 : 다음과 같이 포장하십시오 : https://askubuntu.com/a/106359/449


4
스크립트가 루트 권한으로 실행되지 않도록 "RUN"명령 앞에 "su your_user -c"를 추가하는 것이 좋습니다.
Kees Cook

3
@Kees 여기서 목표를 설정하는 데 루트 권한을 유지하는 것이 좋습니다. 아마도 스크립트를 사용자의 집에 보관하는 대신 /root/루트 만 편집 할 수있는 곳에 보관 하십시오.
Oli

2
이것은 질문에 대답하지 않습니다. 이 질문은 USB 드라이브가 마운트 될 때 스크립트를 실행하는 방법을 묻습니다 . 이 답변은 USB 드라이브를 삽입 할 때 USB 드라이브를 마운트하는 스크립트를 실행하는 방법을 알려줍니다 . 차이가 중요합니다 (디지털 카메라 용). 스크립트가 없으면 드라이브는 삽입시 (사용자 설정에 따라) 마운트 될 수 있으며 드라이브를 마운트 할 때만 무언가를하고 싶습니다 (이미지 복사). 따라서 내 드라이브 (드라이브가 추가 될 때 실행)는 종종 잘못된 시간에 실행됩니다.
Reinier Post


이것은 매우 구체적인 (취약한) 달성 방법입니다. @sumid 답변은 systemd를
MrMesees

8

ATTRS {idVendor} 및 ATTRS {idProduct}의 값을 얻는 또 다른 방법은 Ubuntu 12.04에서 테스트 한 것입니다.

  1. USB가 마운트 된 위치를 찾으십시오.

    $ mount | grep /dev/sd*
    

    이것은 다음과 같은 것을 보여줍니다.

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. 장치 정보를 얻으려면 udevadm을 사용하십시오.

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    출력은 다음과 같아야합니다.

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. 이제 ATTRS {idProduct}의 모델 ID와 ATTRS {idVendor}의 공급 업체 ID를 사용하십시오.

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    

1

노틸러스의 편집> 기본 설정> 미디어에서 "기타 작업"과 "비용 명령"을 선택할 수 있습니다. 다른 종류의 미디어를 실행할 수 있습니다. 그때까지 USB 드라이브가 이미 마운트되어 있지만 여전히 costum 명령으로 드라이브를 표시 할 폴더에 연결할 수 있다고 가정합니다. udev를 사용하는 것보다 이것이 더 쉬운 지 또는 더 나은지 알 수 없었습니다.


명령은 의상을 입습니까? 또는 costum?
erjoalgo

1

장치 마운트 및 마운트 해제에 대한 파일 관리자 (노틸러스, konquerer, gnome 등)의 제어를 방해하지 않으려면 udev 경로를 사용하지 않는 것이 좋습니다.

대신, 사용 udisks - 접착제 시스템 사용의 udisks이 (거의 모든 할) 경우.

설치가 끝나면 ~/.udisks-glue.conf홈 디렉토리에 다음과 같이 구성 파일 을 만드 십시오.

다음 예제는 SD 카드를 꽂을 때마다 카메라의 GPS-Assist 데이터를 업데이트합니다.

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

그런 다음 부팅하거나 로그인 할 때 udisks-glue가 시작되는지 확인하십시오. 그놈의 시작 응용 프로그램을 통한 즉


1
udev2를 지원하지 않습니다 :-(
sumid


0

@sumid의 답변에 문제가 있습니다. 서비스를 시작 해서는 안됩니다 . 당신은 그것을 활성화해야합니다.

파일: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

그런 다음 서비스를 활성화하십시오.

sudo systemctl enable your.service

그게 다야.

참고 : 다음을 사용 하여 중간 레이블을 찾을 수 있습니다.sudo systemctl list-units -t mount

참고 2 : 서비스가 실패한 경우 (예 : 스크립트를 실행할 수없는 경우) <old_mount_point_name>1다음 번에 USB 장치를 마운트 할 때 마운트 지점이 변경됩니다 . 이 문제를 해결하려면 다음을 실행하면됩니다.sudo systemctl reset-failed

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