如何获取连接到系统的USB驱动器的目录?

6 投票
5 回答
11359 浏览
提问于 2025-04-17 23:41

我需要找到一个USB驱动器创建的文件夹路径(我想应该是类似于/media/user/xxxxx这样的路径),因为我正在制作一个简单的USB大容量存储设备浏览器。有没有人能推荐一个最简单的方法来做到这一点?我正在使用Ubuntu 13.10的电脑,并且会在一个Linux设备上使用它。

我需要用Python来实现这个功能。

5 个回答

0

在Python中使用简单的shell管道:

import subprocess
driver_name = "my_usb_stick"

path = subprocess.check_output("cat /proc/mounts | grep '"+driver_name+"' | awk '{print $2}'", shell=True)

path = path.decode('utf-8') # convert bytes in string
>>> "/media/user/my_usb_stick"

解释

  • /proc/mounts/:这是一个文件,列出了所有已挂载的设备。
  • 第一列显示的是挂载的设备。
  • 第二列显示的是挂载点,也就是设备在系统中的位置。
  • 第三列告诉你文件系统的类型。
  • 第四列说明这个设备是只读(ro)还是可读写(rw)。
  • 第五和第六列是一些虚拟值,用来匹配/etc/mtab中的格式。

更多细节请查看这个回答:如何理解 /proc/mounts?

  • grep会返回包含你驱动程序名称的那一行。

  • awk会返回第二列,也就是挂载点,也就是你的路径。

0

我需要进一步修改@nick-sikrier和@m-wasowski的回答,以便处理LUKs加密的设备。

def get_usb_devices():
    sdb_devices = map(os.path.realpath, glob('/sys/block/sd*'))
    usb_devices = (dev for dev in sdb_devices
                   if any(['usb' in dev.split('/')[5],
                           'usb' in dev.split('/')[6]]))
    return dict((os.path.basename(dev), dev) for dev in usb_devices)

def get_mount_points(
    devices = get_usb_devices()
    fullInfo = []
    for dev in devices:
        output = subprocess.check_output(['lsblk', '-lnpo', 'NAME,MOUNTPOINT', '/dev/' + dev]).splitlines()
    for mnt_point in output:
        mnt_point_split = mnt_point.split(' ', 1)
        if len(mnt_point_split) > 1 and mnt_point_split[1].strip():
            fullInfo.append([mnt_point_split[0], mnt_point_split[1]])
    return fullInfo
4

使用m.wasowski的代码时,可能会出现意想不到的问题:

return [(info.split()[0], info.split()[2]) for info in usb_info]

这段代码可能会出错,如果你的USB设备名称中有空格字符。我遇到的情况是设备名为“USB DEVICE”。

info.split()[2]

它返回给我的结果是media/home/USB,但实际上应该是media/home/USB DEVICE。

我修改了那部分代码,让它查找“type”这个词,并用下面的代码替换了那一行:

#return [(info.split()[0], info.split()[2]) for info in usb_info]

fullInfo = []
for info in usb_info:
    print(info)
    mountURI = info.split()[0]
    usbURI = info.split()[2]
    print(info.split().__sizeof__())
    for x in range(3, info.split().__sizeof__()):
        if info.split()[x].__eq__("type"):
            for m in range(3, x):
                usbURI += " "+info.split()[m]
            break
    fullInfo.append([mountURI, usbURI])
return fullInfo
6

我需要对@m.wasowski的代码进行一些修改,以便它能在Python3.5.4上正常运行,修改后的代码如下。

def get_mount_points(devices=None):
    devices = devices or get_usb_devices()  # if devices are None: get_usb_devices
    output = check_output(['mount']).splitlines()
    output = [tmp.decode('UTF-8') for tmp in output]

    def is_usb(path):
        return any(dev in path for dev in devices)
    usb_info = (line for line in output if is_usb(line.split()[0]))
    return [(info.split()[0], info.split()[2]) for info in usb_info]
15

这段内容可以帮助你入门:

#!/usr/bin/env python

import os
from glob import glob
from subprocess import check_output, CalledProcessError

def get_usb_devices():
    sdb_devices = map(os.path.realpath, glob('/sys/block/sd*'))
    usb_devices = (dev for dev in sdb_devices
        if 'usb' in dev.split('/')[5])
    return dict((os.path.basename(dev), dev) for dev in usb_devices)

def get_mount_points(devices=None):
    devices = devices or get_usb_devices() # if devices are None: get_usb_devices
    output = check_output(['mount']).splitlines()
    is_usb = lambda path: any(dev in path for dev in devices)
    usb_info = (line for line in output if is_usb(line.split()[0]))
    return [(info.split()[0], info.split()[2]) for info in usb_info]

if __name__ == '__main__':
    print get_mount_points()

它是怎么工作的呢?

首先,我们会查看 /sys/block 目录下的 sd* 文件(这个方法来自于 这个链接),这样可以过滤掉 USB 设备。

接下来,你会调用 mount 命令,并从输出中只提取那些设备的相关信息。

当然,可能会有一些特殊情况导致这个方法不奏效,比如兼容性问题等等。也可能有更好的方法来实现这个功能。如果你想了解更多,建议去 SuperUser 或 ServerFault 上寻求帮助,那里的 Linux 专家会更有经验。

撰写回答