如何在不知道挂载点的情况下知道设备UUID已挂载?

LinuxSecurityFreak

系统:基于Ubuntu 18.04 LTS的Linux Mint 19.1 Cinnamon 64位。


我想知道是否有可能获得以下信息:

是否已安装(块设备的)UUID(不知道安装点)

尽管如此,我已经玩了半天,但我无法弄清楚。

我至少创建了一些工作代码,在这些代码下,这两个USB硬盘驱动器均会卸装并关闭电源。


我的代码的当前临时版本如下所示:

dismount_and_poweroff_external_drives()
{
    name_external_drive_500gb_ntfs='500GB NTFS USB 2.0 HDD'
    name_external_drive_2_0tb_ext4='2.0TB Ext4 USB 3.0 HDD'
    uuid_external_drive_500gb_ntfs='xxxxxxxxxxxxxxxx' # censored
    uuid_external_drive_2_0tb_ext4='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' # censored
    path_external_drive_500gb_ntfs="/dev/disk/by-uuid/${uuid_external_drive_500gb_ntfs}"
    path_external_drive_2_0tb_ext4="/dev/disk/by-uuid/${uuid_external_drive_2_0tb_ext4}"

    tput bold; tput setaf 3; printf '%b' "\\n${name_external_drive_500gb_ntfs} un-mount\\n"; tput sgr0
    # info test ‘-b FILE’: True if FILE exists and is a block special device.
    if [ ! -b "${path_external_drive_500gb_ntfs}" ]
    then
        tput bold; tput setaf 4; printf '%b' "The device is not plugged in or powered on.\\n"; tput sgr0
    else
        if umount "${path_external_drive_500gb_ntfs}"
        then
            tput bold; tput setaf 2; printf '%b' "Un-mounting OK.\\n"; tput sgr0

            if udisksctl power-off --block-device "${path_external_drive_500gb_ntfs}"
            then
                tput bold; tput setaf 2; printf '%b' "Powering-off OK.\\n"; tput sgr0
            else
                tput bold; tput setaf 1; printf '%b' "Powering-off Failed.\\n"; tput sgr0
            fi

        else
            tput bold; tput setaf 1; printf '%b' "Un-mounting Failed.\\n"; tput sgr0
        fi
    fi

    printf '\n'

    tput bold; tput setaf 3; printf '%b' "\\n${name_external_drive_2_0tb_ext4} un-mount\\n"; tput sgr0
    # info test ‘-b FILE’: True if FILE exists and is a block special device.
    if [ ! -b "${path_external_drive_2_0tb_ext4}" ]
    then
        tput bold; tput setaf 4; printf '%b' "The device is not plugged in or powered on.\\n"; tput sgr0
    else
        if umount "${path_external_drive_2_0tb_ext4}"
        then
            tput bold; tput setaf 2; printf '%b' "Un-mounting OK.\\n"; tput sgr0

            if udisksctl power-off --block-device "${path_external_drive_2_0tb_ext4}"
            then
                tput bold; tput setaf 2; printf '%b' "Powering-off OK.\\n"; tput sgr0
            else
                tput bold; tput setaf 1; printf '%b' "Powering-off Failed.\\n"; tput sgr0
            fi

        else
            tput bold; tput setaf 1; printf '%b' "Un-mounting Failed.\\n"; tput sgr0
        fi
    fi

    printf '\n'
}

我忘记强调必须接受POSIX编写的解决方案

费兹

原始解决方案

UUID=<device_uuid>
mount | egrep $(readlink -f /dev/disk/by-uuid/${UUID}) && echo mounted

弗拉斯蒂米尔的笔记

  • 帮助中使用-e代替可能是一个好主意-freadlink

    -e, --canonicalize-existing   canonicalize by following every symlink in
                                  every component of the given name recursively,
                                  all components must exist
    

    相比于:

    -f, --canonicalize            canonicalize by following every symlink in
                                  every component of the given name recursively;
                                  all but the last component must exist
    

    据我了解,可以-e保证整个路径都存在,可能会更好,需要额外的验证或引用。不幸的是,该-e选项不符合POSIX标准,所以很幸运。将所有信息保留在此处以供将来参考。

  • 原始解决方案中没有双引号,我建议将它们与一个尾随空格一起添加作为一种安全措施,以避免例如与之sda11类似的匹配

  • 也可以利用POSIX定义的属性fgrep来匹配固定的字符串,甚至可以更好地匹配使用开头的从此设备开始的行grep "^dev_name"

  • 正如Mark Plotnick所指出的那样mount它本身可能不是POSIX定义的,再次引用将很方便,但是无论如何,我已经将代码更改为/proc/mounts直接读取


合理的功能

用于检查是否已安装UUID结果函数可能类似于:

is_uuid_mounted()
{
    readlink_output=$( readlink -f /dev/disk/by-uuid/"${1}" )
    [ -n "${readlink_output}" ] &&
        grep -F "${readlink_output} " /proc/mounts > /dev/null 2>&1
}

完整的工作脚本

#!/bin/sh

set -eu

translate_uuid_to_device_name()
{
    # Linux-specific; needs *BSD revision
    readlink -f -n /dev/disk/by-uuid/"${1}"
}

is_uuid_mounted()
{
    device_name=$( translate_uuid_to_device_name "${1}" )

    if [ -n "${device_name}" ]
    then
        # 1. basic regex should be working across platfotms
        #    tested on FreeBSD, OpenBSD, NetBSD with success
        #    I prefer the starting with (^) rather than filtering throung all text
        # 2. /proc/mounts is not available on all *BSDs, needs revision
        proc_mounts=$( grep "^${device_name} " /proc/mounts )
        [ -n "${proc_mounts}" ]
    fi
}

# Simplest Usage Example
if is_uuid_mounted "PUT_SOME_UUID_IN_HERE"
then
    echo "This UUID is mounted."
else
    echo "This UUID isn't mounted."
fi

请随时在评论中解决其他问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不知道iOS中的UUID的情况下检测ibeacon设备?

来自分类Dev

在不知道文件系统类型或源设备的情况下使用 mount() 重新挂载文件系统

来自分类Dev

CoreBluetooth框架:如何在不知道服务ID的情况下获取连接的设备?

来自分类Dev

CoreBluetooth框架:如何在不知道服务ID的情况下获取连接的设备?

来自分类Dev

如何在不知道已保存数据的变量名的情况下使用Octave中的加载功能?

来自分类Dev

Parse.com-如何在不知道密码的情况下以用户身份登录?

来自分类Dev

Javascript:如何在不知道键名的情况下解析json数组?

来自分类Dev

如何在不知道包名称的情况下从adb删除应用程序?

来自分类Dev

PHP如何在不知道扩展名的情况下从URL获取图像

来自分类Dev

如何在不知道要查询哪些字段的情况下构建Django查询?

来自分类Dev

R如何在不知道长度的情况下进行for循环?

来自分类Dev

在Objectify中,如何在不知道父键的情况下通过ID加载实体?

来自分类Dev

如何在不知道bash扩展名的情况下提取各种zip文件

来自分类Dev

如何在不知道分割字符先验的情况下分割字符串?

来自分类Dev

如何在不知道它是否为数组的情况下遍历JSON属性?

来自分类Dev

如何在不知道输入大小的情况下读取输入?

来自分类Dev

如何在不知道宽度或高度的情况下最好地对矩形的角进行排序?

来自分类Dev

如何在不知道键的情况下从字典中获得价值?

来自分类Dev

如何在不知道名称的情况下访问.mat文件中的“值”?

来自分类Dev

如何在不知道速度的情况下计算轨迹角

来自分类Dev

如何在不知道确切OU的情况下进行LDAP查询

来自分类Dev

如何在不知道div ID的情况下删除div的类?

来自分类Dev

如何在不知道其实现的情况下对堆栈ADT进行单元测试

来自分类Dev

如何在不知道有多少项的情况下使用foreach遍历多维数组?

来自分类Dev

如何在不知道类名的情况下使用NDB查询

来自分类Dev

如何在不知道位置对象的情况下继承链接组件上的查询参数

来自分类Dev

如何在不知道索引值名称的情况下打印数组的值

来自分类Dev

如何在不知道Gson密钥的情况下解析JsonObject List?

来自分类Dev

如何在不知道其长度的情况下遍历char **

Related 相关文章

  1. 1

    如何在不知道iOS中的UUID的情况下检测ibeacon设备?

  2. 2

    在不知道文件系统类型或源设备的情况下使用 mount() 重新挂载文件系统

  3. 3

    CoreBluetooth框架:如何在不知道服务ID的情况下获取连接的设备?

  4. 4

    CoreBluetooth框架:如何在不知道服务ID的情况下获取连接的设备?

  5. 5

    如何在不知道已保存数据的变量名的情况下使用Octave中的加载功能?

  6. 6

    Parse.com-如何在不知道密码的情况下以用户身份登录?

  7. 7

    Javascript:如何在不知道键名的情况下解析json数组?

  8. 8

    如何在不知道包名称的情况下从adb删除应用程序?

  9. 9

    PHP如何在不知道扩展名的情况下从URL获取图像

  10. 10

    如何在不知道要查询哪些字段的情况下构建Django查询?

  11. 11

    R如何在不知道长度的情况下进行for循环?

  12. 12

    在Objectify中,如何在不知道父键的情况下通过ID加载实体?

  13. 13

    如何在不知道bash扩展名的情况下提取各种zip文件

  14. 14

    如何在不知道分割字符先验的情况下分割字符串?

  15. 15

    如何在不知道它是否为数组的情况下遍历JSON属性?

  16. 16

    如何在不知道输入大小的情况下读取输入?

  17. 17

    如何在不知道宽度或高度的情况下最好地对矩形的角进行排序?

  18. 18

    如何在不知道键的情况下从字典中获得价值?

  19. 19

    如何在不知道名称的情况下访问.mat文件中的“值”?

  20. 20

    如何在不知道速度的情况下计算轨迹角

  21. 21

    如何在不知道确切OU的情况下进行LDAP查询

  22. 22

    如何在不知道div ID的情况下删除div的类?

  23. 23

    如何在不知道其实现的情况下对堆栈ADT进行单元测试

  24. 24

    如何在不知道有多少项的情况下使用foreach遍历多维数组?

  25. 25

    如何在不知道类名的情况下使用NDB查询

  26. 26

    如何在不知道位置对象的情况下继承链接组件上的查询参数

  27. 27

    如何在不知道索引值名称的情况下打印数组的值

  28. 28

    如何在不知道Gson密钥的情况下解析JsonObject List?

  29. 29

    如何在不知道其长度的情况下遍历char **

热门标签

归档