如何在每次安装 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

Debian 8.0(杰西)、Linux 3.16.0、Gnome 3.14。

答案1

Linux 没有在所有情况下安装设备时都会运行的钩子。

乌德夫当设备出现在系统中时对其进行处理。它可以在此时运行命令(例子)。虽然您可以mount从 udev 运行,但这与U盘,特别是在使用的系统上不起作用系统可以监控 Udisk 执行的挂载,但我不知道如何从命令行执行此操作。有一个Gentoo wiki 上的 Python 示例

有一个工具可以监视任意系统调用:审核制度。每当mount系统调用返回时,以下命令都会触发日志条目:

auditctl -a exit,always -S mount

您可以通过以下方式从审核事件触发程序奥迪斯普,但这不是很方便:您需要编写一个解析审核事件的插件。

答案2

编写一个 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 挂载,但可以由给定用户卸载。在最后一个块中,您必须将 YOURUSERNAME 更改为您的用户名,并将 /etc/udev/scripts/my-script.sh 更改为脚本的路径。来源和更多脚本:https://wiki.archlinux.de/title/Udev#USB_Ger.C3.A4te_automatisch_einbinden


另一个解决方案是使用 udisks 包装器,例如开发者

相关内容