web-dev-qa-db-ja.com

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

Debian 8.0(jessie)、Linux 3.16.0、Gnome3.14。

4
schmiddl

最初に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"

注:ドライブはrootによってマウントされますが、特定のユーザーがマウント解除できます。最後のブロックでは、YOURUSERNAMEをユーザー名に変更し、/ etc/udev/scripts /my-script.shをスクリプトへのパスに変更する必要があります。ソースおよびその他のスクリプト: https://wiki.archlinux.de/title/Udev#USB_Ger.C3.A4te_automatisch_einbinden


別の解決策は、 devmon のようなudisksラッパーを使用することです。

1
schmiddl

Linuxには、あらゆる状況でデバイスがマウントされたときに実行されるフックがありません。

dev デバイスがシステムに表示されたときにデバイスを処理します。その時点でコマンドを実行できます( )。 udevからmountを実行できますが、これは disks と競合し、特に systemd を使用するシステムでは機能しません。 disksによって実行されるマウントを監視することは可能です ですが、コマンドラインからそれを行う方法がわかりません。 Gentoo wikiのPythonの例 があります。

任意のシステムコールを監視する機能があります: 監査システム 。次のコマンドは、mountシステムコールが戻るたびにログエントリをトリガーします。

auditctl -a exit,always -S mount

audisp を介して監査イベントからプログラムをトリガーできますが、これはあまり便利ではありません。監査イベントを解析するプラグインを作成する必要があります。