USB가 마운트될 때마다 스크립트를 실행하는 방법

USB가 마운트될 때마다 스크립트를 실행하는 방법

df를 사용하여 장치의 모든 마운트 지점을 텍스트 파일에 쓰는 스크립트를 사용합니다. 장치(특히 USB)가 마운트될 때마다 어떻게 스크립트를 실행할 수 있나요?

실행할 스크립트:

#!/bin/bash
# save all mountpoints to textfile
df -h /dev/sd*| grep /dev/sd| awk '{print $6}' > /home/<user>/FirstTextfile
# do something
while read line 
do  
echo "mountpoint:${line%/*}/ devicename:${line##*/}}" >> home/<user>/AnotherTextfile

데비안 8.0(제시), 리눅스 3.16.0, 그놈 3.14.

답변1

Linux에는 장치가 마운트될 때 모든 경우에 실행되는 후크가 없습니다.

우데브시스템에 나타나는 대로 장치를 처리합니다. 이 시점에서 명령을 실행할 수 있습니다(). udev에서 실행할 수 있지만 mount이는 다음과 동일하지 않습니다.U 디스크, 특히 다음을 사용하는 시스템에서는 작동하지 않습니다.체계.Udisk에서 수행된 마운트를 모니터링할 수 있습니다., 명령줄에서 이 작업을 수행하는 방법을 모르겠습니다. 하나 있다젠투 위키의 Python 예제.

임의의 시스템 호출을 모니터링할 수 있는 도구가 있습니다.감사 시스템. mount다음 명령은 시스템 호출이 반환될 때마다 로그 항목을 트리거합니다.

auditctl -a exit,always -S mount

다음을 수행하여 감사 이벤트에서 프로그램을 트리거할 수 있습니다.오디시프, 그러나 이는 그리 편리하지 않습니다. 감사 이벤트를 구문 분석하는 플러그인을 작성해야 합니다.

답변2

먼저 USB 드라이브를 마운트한 다음 my-script를 실행하는 udev 규칙을 작성하세요.

# cat /etc/udev/rules.d/11-media-by-label-with-pmount.rules

KERNEL!="sd[a-z]*", GOTO="media_by_label_auto_mount_end"
ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="media_by_label_auto_mount_end"

# Get label
PROGRAM=="/sbin/blkid -o value -s LABEL %N", ENV{dir_name}="%c"

# use basename to correctly handle labels such as ../mnt/foo
PROGRAM=="/usr/bin/basename '%E{dir_name}'", ENV{dir_name}="%c"
ENV{dir_name}=="", ENV{dir_name}="usbhd-%k"

ACTION=="add", ENV{dir_name}!="", RUN+="/bin/su YOURUSERNAME -c '/usr/bin/pmount %N %E{dir_name}'", RUN+="/etc/udev/scripts/my-script.sh"
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/su YOURUSERNAME -c '/usr/bin/pumount /media/%E{dir_name}'"
LABEL="media_by_label_auto_mount_end"

참고: 드라이브는 루트로 마운트되지만 특정 사용자가 마운트 해제할 수 있습니다. 마지막 블록에서 YOURUSERNAME을 사용자 이름으로 변경하고 /etc/udev/scripts/my-script.sh를 스크립트 경로로 변경해야 합니다. 소스 및 추가 스크립트:https://wiki.archlinux.de/title/Udev#USB_Ger.C3.A4te_automatisch_einbinden


또 다른 해결책은 다음과 같은 udisks 래퍼를 사용하는 것입니다.개발자.

관련 정보