Linux

每次掛載任何 USB 時如何執行腳本

  • September 9, 2018

我使用一個腳本,它使用 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、Gnome 3.14。

編寫一個 udev 規則,首先安裝 USB 驅動器,然後執行 my-script

# 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 安裝,但可以由給定使用者解除安裝。在最後一個塊中,您必須使用您的使用者名和 /etc/udev/scripts/my-script.sh 更改您的使用者名和腳本的路徑。原始碼和更多腳本:https ://wiki.archlinux.de/title/Udev#USB_Ger.C3.A4te_automatisch_einbinden


另一種解決方案是使用像devmon這樣的 udisks 包裝器。

Linux 沒有在任何情況下都掛載設備時執行的掛鉤。

Udev會在設備出現在系統中時對其進行處理。它可以在該點執行命令(範例)。儘管您可以mount從 udev 執行,但這與Udisks衝突,特別是在使用systemd的系統上不起作用。可以監視 Udisks 執行的掛載,但我不知道如何從命令行執行此操作。Gentoo wiki 上有一個Python 範例。

有一個工具可以監視任意系統呼叫:審計系統mount每當系統呼叫返回時,以下命令都會觸發日誌條目:

auditctl -a exit,always -S mount

您可以通過audisp從審計事件觸發程序,但這不是很方便:您需要編寫一個解析審計事件的外掛。

引用自:https://unix.stackexchange.com/questions/208815