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

如何枚举已连接的USB存储设备Ubuntu Java,java,ubuntu-14.04,usb-drive,Java,Ubuntu 14.04,Usb Drive,我有一个应用程序,主要是用Java语言编写的,它通过网页GUI(由Ubuntu机器提供服务)控制机载红外摄像机,当计算机通电并在引导结束时,GUI会自动运行。应用程序以用户而不是root用户身份运行,即使用户未登录 收集大量图像后,需要使用rsync将数据归档到操作员USB驱动器上的文件夹中。我需要有USB驱动器安装,并知道其名称标签。计算机是无头的,飞机上的操作员无论如何都不可能知道Linux 在Ubuntu上,我看到已登录并运行xfce4 GUI的用户,只有在登录并运行xfce4 GUI之后

我有一个应用程序,主要是用Java语言编写的,它通过网页GUI(由Ubuntu机器提供服务)控制机载红外摄像机,当计算机通电并在引导结束时,GUI会自动运行。应用程序以用户而不是root用户身份运行,即使用户未登录

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

在Ubuntu上,我看到已登录并运行xfce4 GUI的用户,只有在登录并运行xfce4 GUI之后,驱动器才会列在/media/user name/drive标签中(我注意到/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驱动器?

首先安装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
有关这些步骤的说明,请参阅。请注意,仅支持驱动器格式的子集,包括无处不在的VFAT

使用此插件,USB外部驱动器和thumb驱动器将以/media/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”。使用sync选项进行的完整备份在我取消之前运行了一个多小时,但在删除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;
}
public static ArrayList usbDriveList()引发FileNotFoundException{
最后一个字符串MTB_ADDRESS=“/etc/mtab”;
最终字符串TARGET=“^/media/usb[0-7]$”;//REGEX
最终文件=新文件(MTB_地址);
最终ArrayList驱动器列表=新ArrayList();
尝试(扫描仪输入=新扫描仪(文件)){
while(在.hasNext()中){
最后一个字符串[]splitLine=in.nextLine().split(“”);
if(分割线[1]。匹配(目标)){
driveList.add(分割线[1]);//明白了!
}
}
}捕获(最终文件NotFounde异常){
抛出新的FileNotFoundException();
}
返回驱动器列表;
}

我不知道,现在如何用纯java实现。我需要更多地了解这一点。尽管如此,在Ubuntu上,您只需在终端中调用
lsusb
命令即可。它将显示有关USB端口及其连接设备的信息。您可以使用
-t
参数查看树层次结构中的端口,或使用
-v
参数查看有关端口和连接设备的详细信息。这并不能回答你的全部问题,但它可能是解决问题的起点。谢谢,假设巴士004始终与两个端口相连,那么我得到的是“LaCie,Ltd”(在本例中)制造的东西存在。