如何从终端访问USB闪存驱动器?

我只能访问命令行。 我需要将我的数据(位于用户文件夹中)备份到一个U盘(USB DOK)。
  • 我应该如何手动挂载闪存驱动器?
  • 复制命令应该是什么?

这对我来说很有帮助,可以看到文件列表和它们的大小:https://www.askdavetaylor.com/access-usb-flash-thumb-drive-in-ubuntu-linux-gui-command-line-cli/ - Ryan
7个回答

1. 找到驱动器的名称

要挂载驱动器,您需要知道它的名称。为了做到这一点,请执行以下操作之一(按照我的首选顺序排列):

lsblk
sudo blkid
sudo fdisk -l

你正在寻找一个分区,应该长这样:/dev/sdb1。你拥有的硬盘越多,这个字母可能会更高。无论如何,请找到它并记住它的名称。

2. 创建挂载点(可选)

这需要被挂载到文件系统的某个地方。如果你懒得找,而且没有其他东西挂载在那里,你通常可以使用 /mnt/,否则你将需要创建一个新目录:

sudo  mkdir /media/usb

3. 上马!
sudo mount /dev/sdb1 /media/usb

完成后,只需发送即可:
sudo umount /media/usb

这个答案已经有将近6年的历史了,虽然核心部分仍然有效,但像`fdisk -l`这样的选项并不是最用户友好的。在更高层次的堆栈中,还有一些新的机制可以以合理和标准的方式挂载设备,但这些机制可能并不总是可用。
所以我从其他答案中添加了一些改进。当您阅读这个脚注时,如果您正在使用桌面系统,肯定有理由使用`udisksctl`,参考wecac的答案。这种方式与桌面系统相同——创建自己的`/media/$USER/device`目录——但我认为对于静态挂载点仍然有争议,特别是当您不希望路径发生变化时。
Udisks还依赖于D-Bus,因此可能并非在所有地方都可用。

2这种方法的主要缺点是将设备挂载为root。如果设备是FAT格式化的,用户将无法对其进行写入操作。/media/$USER/device挂载点也将始终保持不变。 - eMBee
1所有的回答都假定在插入USB闪存驱动器后会神奇地出现一个/dev/sdX。但是,如果没有呢?我在日志中看到它被检测到了,但是没有新的/dev。lsusb也显示了所有的细节。例如,sudo lsusb -vs 15:2 | grep id给出了idVendor 0x090c Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.)idProduct 0x1000 Flash Drive - Carlo Wood
12022年仍然适用于Ubuntu 20.x。 - Ashwani Garg
@CarloWood 我曾经遇到过类似的情况。在一些日志中,我想是dmesg或其他什么东西,我发现驱动器无法自行上电。最后我只能使用另一个端口来连接驱动器。据我所知,如果设备驱动程序没有在/dev/目录下创建设备文件,是无法挂载驱动器的。 - Harish Ganesan

pmount / pumount

安装pmount。将磁盘挂载到/media/。

pmount /dev/sdb1
pumount /dev/sdb1

不需要sudo
将"sdb1"替换为您的特定设备路径。有关更多信息,请参阅manpage
pmount  ("policy mount") is a wrapper around the standard mount program
which permits normal users to mount removable devices without a  match-
ing /etc/fstab entry.

pmount is invoked like this:

pmount device [ label ]

This  will  mount  device  to a directory below /media if policy is met
(see below). If label is given, the mount point will  be  /media/label,
otherwise it will be /media/device.

mount坚持以只读方式挂载我的驱动器时,这个方法起作用了。 - Jonathan E. Landrum
谢谢,我知道如何执行被接受的答案,但我正在寻找一些更简单的方法,以免让我自己清理空文件夹。 - Matt

使用udisksctl命令,该命令位于udisks2软件包中(在Ubuntu和Debian中均可使用)。操作步骤如下:
  1. дҪҝз”Ё lsblk жҹҘжүҫиҰҒжҢӮиҪҪзҡ„еқ—и®ҫеӨҮзҡ„ IDпјҡ

    user@machine:~$ lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   1.8T  0 зЈҒзӣҳ
    в”ңв”Җsda1   8:1    0  19.1M  0 еҲҶеҢә /boot/efi
    в”ңв”Җsda2   8:2    0   1.8T  0 еҲҶеҢә
    в””в”Җsda3   8:3    0    16G  0 еҲҶеҢә [SWAP]
    sdb      8:16   0 931.5G  0 зЈҒзӣҳ
    в”ңв”Җsdb1   8:17   0    37M  0 еҲҶеҢә
    в”ңв”Җsdb2   8:18   0  15.9G  0 еҲҶеҢә [SWAP]
    в””в”Җsdb3   8:19   0 915.7G  0 еҲҶеҢә /
    sdc      8:32   1  14.4G  0 зЈҒзӣҳ
    в””в”Җsdc1   8:33   1  14.4G  0 еҲҶеҢә
    sdd      8:48   0   1.8T  0 зЈҒзӣҳ
    в””в”Җsdd1   8:49   0   1.8T  0 еҲҶеҢә
    

    ж №жҚ®е…¶еӨ§е°ҸпјҢ/dev/sdc1 зңӢиө·жқҘжҳҜжҲ‘иҰҒжҢӮиҪҪзҡ„ USB и®ҫеӨҮгҖӮ

  2. дҪҝз”Ё udisksctl жҢӮиҪҪиҜҘи®ҫеӨҮгҖӮжіЁж„ҸпјҢ-b зӯүеҗҢдәҺ --block-deviceпјҲдёәдәҶзј©зҹӯиҫ“е…ҘпјүпјҢдҪҶжҲ‘жӣҙе–ңж¬ўй•ҝйҖүйЎ№д»ҘдҫҝдәҺзј–еҶҷж–ҮжЎЈпјҡ

    user@machine:~$ udisksctl mount --block-device /dev/sdc1
    ==== AUTHENTICATING FOR org.freedesktop.udisks2.filesystem-mount ===
    Authentication is required to mount Kingston DT microDuo 3C (/dev/sdc1)
    Multiple identities can be used for authentication:
     1.  XXXXX,,, (user)
     2.  ,,, (YYYYY)
    Choose identity to authenticate as (1-2): 1
    Password:
    ==== AUTHENTICATION COMPLETE ===
    Mounted /dev/sdc1 at /media/user/USBDRIVELABEL.
    
回应Hans Deragon的评论:你还可以告诉udisksctl执行--no-user-interaction。它不会尝试对用户进行身份验证,通常会“自动运行”。
user@machine:~$ udisksctl mount --block-device /dev/sdc1 --no-user-interaction
# possibly some complaining here about I/O charset or need to run `fsck`
Mounted /dev/sdc1 at /media/user/USBDRIVELABEL.

除了使用需要管理员权限的标准“mount”命令之外,您还可以使用“udisks”和“dbus”以普通用户身份挂载驱动器。
要做到这一点,了解驱动器的一些信息是有用的(但不是必需的):
1. 它是什么设备(例如“/dev/sdb1”) 2. 它使用的文件系统是什么。
知道这些信息后,您可以使用简单的命令从命令行挂载驱动器。
gdbus call --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices/<device> --method org.freedesktop.UDisks.Device.FilesystemMount "<filesystem>" []

这个调用应该在挂载成功后回显它所挂载的路径。
要卸载以这种方式挂载的驱动器,您可以运行:
gdbus call --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices/<device> --method org.freedesktop.UDisks.Device.FilesystemUnmount []

注意:``只是指向设备的路径的结尾。例如,如果您想要挂载的设备位于`/dev/sdb2`,那么您应该将``替换为`sdb2`。
如果你不知道是哪个设备或者使用了什么文件系统,不要担心。你可以用这个简单的命令轻松打印出所有相关信息:
gdbus introspect --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices --recurse --only-properties | grep -E "(readonly .+ (IdLabel|IdType|Device(IsMounted|IsDrive|File) ).*|\}|.*\{)"

这将打印出类似于以下内容:
node /org/freedesktop/UDisks/devices {
  node /org/freedesktop/UDisks/devices/sda {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = '';
        readonly s IdType = '';
        readonly s IdUsage = '';
        readonly b DeviceIsMounted = false;
        readonly s DeviceFile = '/dev/sda';
    };
  };
  node /org/freedesktop/UDisks/devices/sda1 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = 'SYSTEM';
        readonly s IdType = 'ntfs';
        readonly s IdUsage = 'filesystem';
        readonly b DeviceIsMounted = false;
        readonly s DeviceFile = '/dev/sda1';
    };
  };
  node /org/freedesktop/UDisks/devices/sda2 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = 'Windows7';
        readonly s IdType = 'ntfs';
        readonly s IdUsage = 'filesystem';
        readonly b DeviceIsMounted = true;
        readonly s DeviceFile = '/dev/sda2';
    };
  };
  node /org/freedesktop/UDisks/devices/sda3 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = 'Recovery';
        readonly s IdType = 'ntfs';
        readonly s IdUsage = 'filesystem';
        readonly b DeviceIsMounted = false;
        readonly s DeviceFile = '/dev/sda3';
    };
  };
  node /org/freedesktop/UDisks/devices/sda4 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = '';
        readonly s IdType = '';
        readonly s IdUsage = '';
        readonly b DeviceIsMounted = false;
        readonly s DeviceFile = '/dev/sda4';
    };
  };
  node /org/freedesktop/UDisks/devices/sda5 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = '';
        readonly s IdType = 'ext4';
        readonly s IdUsage = 'filesystem';
        readonly b DeviceIsMounted = true;
        readonly s DeviceFile = '/dev/sda5';
    };
  };
  node /org/freedesktop/UDisks/devices/sda6 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = '';
        readonly s IdType = 'swap';
        readonly s IdUsage = 'other';
        readonly b DeviceIsMounted = false;
        readonly s DeviceFile = '/dev/sda6';
    };
  };
  node /org/freedesktop/UDisks/devices/sda7 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = '';
        readonly s IdType = 'ext4';
        readonly s IdUsage = 'filesystem';
        readonly b DeviceIsMounted = true;
        readonly s DeviceFile = '/dev/sda7';
    };
  };
  node /org/freedesktop/UDisks/devices/sdb {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = '';
        readonly s IdType = '';
        readonly s IdUsage = '';
        readonly b DeviceIsMounted = false;
        readonly s DeviceFile = '/dev/sdb';
    };
  };
  node /org/freedesktop/UDisks/devices/sdb1 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = 'USB DRIVE';
        readonly s IdType = 'vfat';
        readonly s IdUsage = 'filesystem';
        readonly b DeviceIsMounted = false;
        readonly s DeviceFile = '/dev/sdb1';
    };
  };
  node /org/freedesktop/UDisks/devices/sr0 {
    interface org.freedesktop.UDisks.Device {
        readonly s IdLabel = '';
        readonly s IdType = '';
        readonly s IdUsage = '';
        readonly b DeviceIsMounted = false;
        readonly s DeviceFile = '/dev/sr0';
    };
  };
};

那些具有IdUsage = 'filesystem'的设备可以使用上述命令进行挂载。
这意味着,例如,如果我想要挂载设备'USB DRIVE',我会运行以下命令
gdbus call --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices/sdb1 --method org.freedesktop.UDisks.Device.FilesystemMount "vfat" []

这些命令都是使用dbus消息系统工作的,就像Nautilus和其他文件管理器自动挂载设备一样。在这些命令中,我们发送各种对象(即/org/freedesktop/...消息)来请求它们挂载和卸载特定设备。根据在PolicyKit中获得的权限,它们可能会或可能不会执行此操作。
使用类似的命令,您可以控制Ubuntu中几乎每个方面的体验,并模拟大多数系统程序和功能(例如关机、音量调节等)。

12015年的方式是gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/drives --recurse --only-properties - nvja

你还可以通过USBmount在Ubuntu Server上自动挂载USB设备。
在开始安装之前,请确保运行apt-get update/upgrade命令进行更新升级:
sudo apt-get update && sudo apt-get upgrade

现在从存储库中安装USBmount:
sudo apt-get install usbmount

USBmount会将所有的USB驱动器挂载在/media/usb*(usb0、usb1、usb2 ...)中。
现在插入一个USB驱动器并等待它被检测和挂载。只要主机操作系统支持文件系统,它就应该被挂载。
要验证USB驱动器是否正确挂载,您可以使用df -h命令查看所有可用的驱动器及其相应的挂载点。
要卸载驱动器,您可以使用umount命令。
sudo umount /media/usb0

1E: Unable to locate package usbmount - Ryan

这很简单。当我想在终端中使用USB驱动器时,我会这样做:
/media中创建一个文件夹:
mkdir /media/mountDrive 

这个文件夹将用作挂载点。使用以下命令:
sudo mount /dev/sdd1 /media/mountDrive 
是我的USB的第一个分区。然后您可以导航到您已经挂载的文件夹。
cd /media/mountDrive

如果你想列出驱动器中的文件,可以使用ls命令。

要卸载驱动器,可以使用

sudo umount /dev/sdd1

请注意,在我的系统中,USB驱动器是/dev/sdd1,但在您的系统中可能会有所不同。要找出它是什么,请使用df命令查看当前连接的所有磁盘。

我不会讲述如何挂载驱动器的内容。然而,由于提问者还询问了最佳的复制数据命令,我将回答这个问题,因为据我所知,这个问题还没有得到解答。
我建议首先在驱动器上创建一个文件夹(即使它是空的),以便备份您的东西并提供组织。类似这样的命令mkdir <mountpath>/mybackup应该可以实现。
其次,我建议使用rsync来复制所有内容。可以尝试类似这样的命令rsync -r ~/* <mountpoint>/mybackup。如果您愿意,也可以使用cp -r,但是我发现这样做并不能始终如您所期望地完成所有操作。