介绍

通过 SSH 连接传输文件,使用 [SFTP](https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote- server) 或 SCP,是一种在服务器之间移动少量数据的流行方法。然而,在某些情况下,可能需要在两个远程环境之间共享整个目录或整个文件系统。虽然这可以通过配置 [SMB](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-samba-share-for-a-small-organization-on- ubuntu-16-04) 或 NFS 安装,两者其中一些需要额外的依赖项,并且可能会引入安全问题或其他开销。

作为替代方案,您可以安装 SSHFS 以单独使用 SSH 挂载远程目录。这样做的显着优势是不需要额外的配置,并且可以从远程系统上的 SSH 用户那里继承权限。当您需要以交互方式逐个读取大量文件时,SSHFS 特别有用。

先决条件

  • 两台 Linux 服务器被配置为允许它们之间的 SSH 访问。其中之一可以是本地机器而不是云服务器。您可以按照我们的 初始服务器设置 指南,通过直接从一台机器连接到另一个。

步骤 1 — 安装 SSHFS

SSHFS 适用于大多数 Linux 发行版。在 Ubuntu 上,您可以使用 apt 安装它。

首先,使用 apt update 来刷新你的包源:

sudo apt 更新

然后,使用 apt install 安装 sshfs 包。

sudo apt install sshfs

注意: SSHFS 可以通过使用名为 FUSE 的文件系统库安装在 Mac 或 Windows 上,它提供与 Linux 环境的互操作性。他们将使用与本教程相同的概念和连接细节,但可能需要您使用不同的配置界面或安装第三方库。本教程将仅介绍 Linux 上的 SSHFS,但您应该能够将这些步骤调整到 Mac 或 Windows FUSE 实现中。

您可以从项目的 GitHub 存储库 安装适用于 Windows 的 SSHFS。

您可以从 macFUSE 项目 安装 SSHFS for Mac。

步骤 2 — 挂载远程文件系统

每当您在 Linux 环境中挂载远程文件系统时,首先需要一个空目录来挂载它。大多数 Linux 环境都包含一个名为 /mnt 的目录,您可以为此目的在其中创建子目录。

注意: 在 Windows 上,远程文件系统有时会使用自己的驱动器号(如 G:)挂载,而在 Mac 上,它们通常挂载在 /Volumes 目录中。

使用 mkdir 命令在 /mnt 中创建一个名为 droplet 的子目录:

sudo mkdir /mnt/droplet

您现在可以使用 sshfs 挂载远程目录。

sudo sshfs -o allow_other,default_permissions sammy@your_other_server:~/ /mnt/droplet

此命令的选项行为如下:

  • -o 在其他挂载选项之前(这与正常运行非 SSH 磁盘挂载的 mount 命令时相同)。在这种情况下,您使用 allow_other 来允许其他用户访问此挂载(这样它的行为就像普通的磁盘挂载一样,因为 sshfs 默认情况下会阻止这种情况)和 default_permissions(否则使用常规文件系统权限)。

  • sammy@your_other_server:~/ 提供远程目录的完整路径,包括远程用户名,sammy,远程服务器,your_other_server 和路径,在这种情况下,~/ 表示远程用户的主目录。这使用与 SSH 或 SCP 相同的语法。

  • /mnt/droplet 是用作挂载点的本地目录的路径。

如果您收到“由对等方重置连接”消息,请确保您已 [将 SSH 密钥复制到远程系统](https://www.digitalocean.com/community/tutorials/how-to-set-up- ssh-keys-on-ubuntu-22-04)。 sshfs 在后台使用普通的 SSH 连接,如果您是第一次通过 SSH 连接到远程系统,可能会提示您接受远程主机的密钥指纹。

输出无法建立主机'164.90.133.64(164.90.133.64)'的真实性。
ED25519 密钥指纹为 SHA256:05SYulMxeTDWFZtf3/ruDDm/3mmHkiTfAr+67FBC0+Q。
此密钥没有任何其他名称
您确定要继续连接(是/否/[指纹])?是的

注意: 如果您需要使用 SSHFS 挂载远程目录而不需要 sudo 权限,您可以在本地计算机上创建一个名为 fuse 的用户组,方法是使用 sudo groupadd fuse,然后添加您的该组的本地用户,通过使用sudo usermod -a -G fuse sammy

您可以使用 ls 列出挂载目录中的文件,以查看它们是否与远程目录的内容匹配:

ls /mnt/droplet
输出remote_file1 remote_file2

现在,您可以处理远程服务器上的文件,就好像它是连接到本地计算机的物理设备一样。例如,如果您在 /mnt/droplet 目录中创建一个文件,该文件将出现在您的虚拟服务器上。同样,您可以将文件复制到 /mnt/droplet 文件夹中或从中取出,它们将在后台上传到您的远程服务器或从您的远程服务器上传。

需要注意的是,mount 命令只为当前会话安装远程磁盘。如果虚拟服务器或本地机器关闭或重新启动,您将需要使用相同的过程再次挂载它。

如果您不再需要此挂载,可以使用 umount 命令卸载它:

sudo umount /mnt/droplet

在最后一步中,您将了解配置永久安装的示例。

步骤 3 — 永久挂载远程文件系统

与其他类型的磁盘和网络挂载一样,您可以使用 SSHFS 配置永久挂载。为此,您需要将配置条目添加到名为“/etc/fstab”的文件中,该文件在启动时处理 Linux 文件系统挂载。

使用 nano 或您喜欢的文本编辑器,打开 /etc/fstab:

须藤纳米 /etc/fstab

在文件末尾,添加如下条目:

/etc/fstab

...
sammy@your_other_server:~/ /mnt/droplet fuse.sshfs noauto,x-systemd.automount,_netdev,reconnect,identityfileu003d/home/sammy/.ssh/id_rsa,allow_other,default_permissions 0 0

永久坐骑通常需要像这样的许多不同选项来确保它们按预期运行。它们的工作方式如下:

  • sammy@your_other_server:~/ 又是远程路径,和以前一样。

  • /mnt/droplet 又是本地路径。

  • fuse.sshfs 指定用于挂载此远程目录的驱动程序。

  • noauto,x-systemd.automount,_netdev,reconnect 是一组选项,它们协同工作以确保网络驱动器的永久挂载在网络连接从本地计算机或远程计算机断开的情况下正常运行。

  • identityfileu003d/home/sammy/.ssh/id_rsa 指定本地 SSH 密钥的路径,以便可以自动挂载远程目录。请注意,此示例假定您的本地用户名和远程用户名都是“sammy”——这是指本地路径。有必要指定这一点,因为 /etc/fstab 有效地以 root 身份运行,否则将不知道哪个用户名的 SSH 配置来检查远程服务器信任的密钥。

  • allow_other,default_permissions 使用与上述 mount 命令相同的权限。

  • 0 表示远程文件系统不应该被本地机器转储或验证以防出错。挂载本地磁盘时,这些选项可能会有所不同。

保存并关闭文件。如果您使用的是“nano”,请按“Ctrl+X”,然后在出现提示时按“Y”,然后按“ENTER”。然后,您可以通过重新启动本地计算机来测试 /etc/fstab 配置,例如使用 sudo reboot now,并验证是否自动重新创建了挂载。

应该注意的是,永久 SSHFS 挂载不一定很流行。 SSH 连接和 SSHFS 的性质意味着它通常更适合临时的一次性解决方案,当您不需要提交可以配置有更大冗余和其他选项的 SMB 或 NFS 挂载时。也就是说,SSHFS 非常灵活,更重要的是,它充当了一个成熟的文件系统驱动程序,它允许您像任何其他磁盘挂载一样在 /etc/fstab 中配置它,并根据需要尽可能多地使用它。请注意,不要意外通过 SSH 暴露出比您预期更多的远程文件系统。

结论

在本教程中,您配置了从一个 Linux 环境到另一个环境的 SSHFS 挂载。尽管对于生产部署而言,它不是最具可扩展性或性能的解决方案,但 SSHFS 可以通过最少的配置非常有用。

接下来,您可能想了解如何使用 object storage,它可以同时安装在多个服务器上。