我正在尝试构建一个插入 USB 驱动器时重新安装的系统。
插入 USB 后,它会被映射到类似的东西/dev/sdc1
。然后我想卸载,然后使用重新安装pmount
(以便获得用户权限,以便另一个程序可以读取/访问 USB 驱动器)。我一直在手动运行以下命令:
sudo umount /dev/sdc1
pmount /dev/sdc1 some_label
然后我有另一个程序可以从中读取文件/media/some_label
。
但是,这需要通过编程来完成。我创建了以下 udev 规则:
ACTION=="add", \
ATTRS{idVendor}=="154b", \
ATTRS{idProduct}=="00ed", \
RUN+="/usr/bin/bash /home/some/script/location/script.sh"
我知道它正在运行,因为我可以将运行命令更改为,mkdir
并且我看到当我插入 USB 时创建了(测试)目录。
但是,我不确定如何/dev/sdc1
在 shell 脚本中以编程方式查找设备路径 ()。这样,我就可以运行上面列出的 2 个命令。
有什么建议么?
答案1
乌德夫:
传递环境变量如下:
RUN+="/home/some/script/location/script.sh DEVNAME=$env{DEVNAME}"
并在脚本中将设备名称的变量script.sh
解析为:$@
if [[ "$@" =~ (DEVNAME=/dev/sd.?) ]] ; then
__DEVNAME="${BASH_REMATCH[1]}"
__DEVNAME="${__DEVNAME#*=}" ; fi
/dev/sda
然后您应该在变量中有设备名称$__DEVNAME
。
重击:
安装jq
方式:
sudo apt install jq
要查找设备分区和挂载点:
对于分区:
sudo lsblk -o NAME -J /dev/sda | jq -r '.blockdevices | .[].children | .[] | .name'
对于挂载点:
__TMPFILE="$(mktemp)"
sudo lsblk -p -o NAME,MOUNTPOINT -J /dev/sda | jq -r '.blockdevices | .[].children | .[] | "declare -A __MOUNTS[\(.name)]=\"\(.mountpoint)\""' > "$__TMPFILE"
source $__TMPFILE
echo "Your mount point for sda1 is ${__MOUNTS[sda1]}"