如何在 Linux 上安装和使用 SSHFS
在此页
- 先决条件
- 将 SSHFS 安装到您的本地计算机
- 基础:使用 SSHFS 挂载和卸载
- 在 SSHFS 上设置 Chroot
- 故障排除
- 结论
SSHFS(SSH 文件系统)是用户空间文件系统 (FUSE) 的一种实现,它使客户端能够通过 SSH 连接挂载远程文件系统。 SSHFS 使用 SSH 文件传输协议 (SFTP) 将远程文件系统挂载到客户端计算机,并且客户端和服务器之间的连接是安全和加密的。
SSHFS 可以作为传统 FTP 协议的替代品。默认情况下通过 SSH 连接是安全的,不需要额外的包或配置。 SSHFS 使用简单的默认 SSH 配置。
在本教程中,您将学习如何使用 SSHFS 在两台 Linux 机器(客户端和服务器)之间以安全的方式挂载远程目录。本指南还包括如何在 SSHFS 上设置 chroot,以防止用户访问其他用户目录。
先决条件
要遵循本指南,您需要两台 Linux 机器、一个客户端和一个服务器。您可以使用任何 Linux 发行版,并确保服务器安装了 OpenSSH 服务器,并且您拥有具有 sudo root 权限的非 root 用户。
将 SSHFS 安装到本地计算机
默认情况下,大多数 Linux 发行版都提供 SSHFS 软件包,包括 Debian/Ubuntu、RHEL/CentOS/Rocky 和 ArchLinux/Manjaro。您可以使用系统包管理器轻松安装它。在本节中,您将在本地/客户端计算机上安装 SSHFS。
首先,通过运行以下命令更新您的包索引列表。
# For Debian/Ubuntu
sudo apt update
# For RHEL/CentOS/RockyLinux
sudo dnf check-update
# For ArchLinux/Manjaro
sudo pacman -Syu
更新包索引后,使用包管理器安装 SSHFS 包,如下所示。在 Debian 和 Archlinux 发行版中,该软件包被命名为 sshfs,但在基于 RHEL 的发行版中,该软件包被称为 fuse-sshfs。
# For Debian/Ubuntu
sudo apt install sshfs
# For RHEL/CentOS/RockyLinux
sudo dnf install fuse-sshfs
# For ArchLinux/Manjaro
sudo pacman -S sshfs
现在您已经在本地机器上完成了 SSHFS 包的安装。接下来,您将学习使用 SSHFS 命令将远程目录/分区挂载和卸载到本地计算机的基本命令。
基础:使用 SSHFS 挂载和卸载
在开始使用 SSHFS 命令之前,请确保您有一台 Linux 服务器,并在其上安装了 OpenSSH。对于服务器的用户认证,您可以使用基于SSH 密码的认证或基于SSH 密钥的认证。但是,您可以考虑使用基于 SSH 密钥的身份验证,这比基于密码的身份验证更安全。
在本节中,您将学习 sshfs 的基本命令,用于将远程目录/分区从服务器挂载到本地/客户端机器。此外,您还将学习如何从本地计算机卸载 sshfs。
1、sshfs通过SSH协议挂载目录到本机的基本命令如下。
sshfs :/remote/directory /local/directory
实际上,从服务器172.16.1.10 将远程目录/srv/data 挂载到本地机器目录~/data。此示例使用 SSH 用户 johndoe。
sshfs :/srv/data ~/data
现在,如果您对 SSH 使用基于密码的身份验证,系统将提示您进行密码身份验证。

要验证,请对本地计算机上的目录 ~/data 运行 ls 命令。
ls -lah ~/data
您将在本地计算机上看到来自远程服务器的文件列表。

2. 现在,要从本地计算机卸载远程目录,请运行命令 fusermount,如下所示。此命令用于挂载和卸载 FUSE 文件系统。
fusermount -u ~/data

3. 您可能感兴趣的 sshfs 命令的另一个示例。
带有调试选项 -d 的 sshfs 命令。每当您使用 sshfs 命令遇到问题时,请使用附加选项 -d 以在连接到服务器时显示所有调试消息。
sshfs :/remote/directory /local/directory -d
现在,如果您运行的服务器具有非标准 SSH 端口,您可以添加选项 -p 后跟您的 SSH 端口。
sshfs :/remote/directory /local/directory -C -p 2222
选项 -C 将启用压缩,等同于 ssh 命令中的选项 -o compression=yes。
如需完整参考,您可以使用 --help 选项或使用 SSHFS 联机帮助页。
sshfs --help
man sshfs
在 SSHFS 上设置 Chroot
在本节中,您将学习如何在 SSHFS 上启用 chroot,这可以通过配置 SSH 服务器并指定用户和目录来实现。 chroot 环境将限制目录访问,但您的用户仍然可以在挂载目录上读写。
1. 首先,您将为您的用户创建一个新的 chroot 目录并允许读写访问。在本指南中,您将创建一个新的共享目录 /srv/shared,然后为每个用户创建一个新的主目录和数据目录。
运行以下命令创建一个新的主共享目录 /srv/shared 并将所有权更改为用户和组 root。
mkdir -p /srv/shared
sudo chown -R root:root /srv/shared
2. 现在,在 /srv/shared 目录下为每个用户创建另一个目录。并确保将该目录的所有权更改为用户和组 root。
mkdir -p /srv/shared/johndoe
sudo chown -R root:root /srv/shared/johndoe
3. 接下来,在用户主目录/srv/shared/johndoe 中创建data 目录。然后将该目录的所有权更改为用户 root 和组 johndoe。最后,允许 johndoe 组在该目录上读写。
mkdir -p /srv/shared/johndoe/data
sudo chown -R root:johndoe /srv/shared/johndoe/data
sudo chmod g+rwx /srv/shared/johndoe/data
现在,您可以挂载远程目录/data,但它相当于服务器上的目录/srv/shared/johndoe/data。

4. 为用户创建 chroot 目录后,您需要编辑 SSH 配置 /etc/ssh/sshd_config。使用 nano 或您最喜欢的文本编辑器对其进行编辑。
sudo nano /etc/ssh/sshd_config
将以下行添加到文件中。
Subsystem sftp internal-sftp
Match User johndoe
ChrootDirectory /srv/shared/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
配置 internal-sftp 将使 SSH 也可以充当 SFTP 服务器。然后将用户 johndoe 的 ChrootDirectory 定义到 /srv/shared/%u 目录。 %u 表示作为用户名。
保存并关闭文件。
5. 接下来,运行以下命令来验证 SSH 配置,并确保没有出现语法错误。然后重新启动 SSH 服务以应用新配置。
sudo sshd -t
sudo systemctl restart sshd
6. 现在,回到客户端/本地机器,然后在 chroot 环境中挂载远程目录。您应该使用 /data 目录,而不是完整路径目录 /srv/shared/johndoe/data。并且您具有对数据目录进行读取、写入和执行的权限。
sshfs :/data ~/data
要验证写访问权限,请使用以下命令在客户端计算机上创建一个新文件。
cd ~/data
echo "This file from client machine" >> another-file.md

现在,回到服务器,导航到目录 /srv/shared/johndoe/data,检查该目录中的可用文件。
cd /srv/shared/johndoe/data/
ls
cat another-file.md
您将看到您刚刚从客户端计算机创建的文件。

在本节中,您已经为 SSHFS 用户创建了 chroot 目录,并配置了 SSH 服务以启用 chroot。
故障排除
如果您在 SSHFS 连接上遇到错误,您可以使用以下方式对连接进行故障排除。
您可以使用带有选项 -d 的调试模式。使用此选项,您将在 shell 终端上看到连接日志。
在调试模式下运行 sshfs 命令,如下所示。
sshfs :/data ~/mnt -d
您可以尝试的另一种方法是检查服务器上的 SSH 日志。在使用 sshfs 命令之前,打开一个新的终端并连接到您的服务器,然后运行 tail 命令来检查 SSH 日志服务。
在基于 Ubuntu/Debian 的系统上,SSH 日志位于 /var/log/auth.log。对于基于 RHEL/CentOS 的系统,SSH 日志位于 /var/log/secure。
# For Ubuntu/Debian
tail -f /var/log/auth.log
# For RHEL/CentOS
tail -f /var/log/secure
结论
恭喜!您现在已经了解了如何使用 SSHFS 将远程目录从服务器挂载到本地计算机。此外,您还学习了如何在 SSHFS 上设置 chroot 环境,以及如何对 SSHFS 连接进行故障排除。