如何枚举连接的USB存储设备Ubuntu Java

时间:2015-08-13 23:15:54

标签: java ubuntu-14.04 usb-drive

我有一个应用程序,主要是Java和#39;通过网页GUI(由Ubuntu机器提供服务)控制机载红外摄像机,当计算机通电并接通启动时,它自动开始运行。即使用户未登录,应用程序也以root用户身份运行。

收集了大量图像后,需要使用rsync将数据存档到操作员的USB驱动器上的文件夹中。我需要安装USB驱动器并知道其名称标签。计算机是无头的,飞机上的操作员无论如何都不能指望Linux。

在Ubuntu上我看到登录并运行xfce4 GUI,只有这样,驱动器列在/ media / user-name / drive-tag中(我注意到/ media / username由root拥有,但是为驱动器命名的文件夹由用户拥有。)并显示在/ etc / mtab中:

/dev/sdd1 /media/programmer/DATA-02-2TB vfat rw,nosuid,nodev,uid=1001,gid=1001,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2 0 0

我如何通过Java或Java和bash的组合来检测和安装USB存储设备?

如果不可能,我需要通过GUI要求用户输入设备标签或名称,例如,< DATA-02-2TB'然后使用上面的信息创建安装点并通过脚本安装USB驱动器?

1 个答案:

答案 0 :(得分:0)

首先安装usbmount,一个Ubuntu工具。

sudo apt-get update
sudo apt-get install usbmount

然后编辑/etc/usbmount/usbmount.conf文件:

sudo sed -i 's/MOUNTOPTIONS="/MOUNTOPTIONS="user,umask=000,/' /etc/usbmount/usbmount.conf

Serverfault描述了这些步骤。请注意,仅支持一部分驱动器格式,包括无处不在的VFAT。

有了这个,USB外置驱动器和拇指驱动器将作为/ media / usb0 / media / usb7安装在/ media中,并将列在/ etc / mtab中。

/dev/sdc1 /media/usb0 vfat rw,noexec,nosuid,nodev,sync,noatime,nodiratime,umask=000 0 0

我在14.04机器上测试了这个。现在,如果我只能获得驱动器标签。

修改:同步选项不适用于闪存驱动器。阅读/etc/usbmount/usbmount.conf文件以获取详细信息并删除" sync"从该文件中的相应行。使用同步选项进行的完整备份在我取消之前运行了一个多小时,但只删除了同步,只花了大约5分钟。请注意有关使用 pumount 来卸载未同步的驱动器的注释。

public static ArrayList<String> usbDriveList() throws FileNotFoundException {

    final String MTB_ADDRESS = "/etc/mtab";
    final String TARGET = "^/media/usb[0-7]$"; // REGEX

    final File file = new File(MTB_ADDRESS);
    final ArrayList<String> driveList = new ArrayList<String>();

    try (Scanner in = new Scanner(file)) {
        while (in.hasNext()) {
            final String[] splitLine = in.nextLine().split(" ");
            if (splitLine[1].matches(TARGET)) {
                driveList.add(splitLine[1]); // got it!
            }
        }
    } catch (final FileNotFoundException e) {
        throw new FileNotFoundException();
    }

    return driveList;
}