在两台服务器间借助 SSH 连接使用 SFTP 或 SCP 可以互相传输文件,但这确不能共享整个文件系统。当我们想要像访问本地服务器的文件系统一样访问远程服务器的文件系统时,可以使用 sshfs 工具,它通过 SSH 文件传输协议 (SFTP) 挂载远程的文件系统。本篇以 ubuntu 系统为例,所有代码以普通用户运行,部分代码需要 sudo 权限。

安装

1
2
sudo apt update
sudo apt install sshfs

挂载远程服务器文件系统

假设本地的用户 jinzhongxu 能够通过 SSH 连接到远程服务器 tencent.test.com

1
2
3
4
5
6
# 创建挂载点
sudo mkdir /mnt/tencent
sudo chown -R jinzhongxu:jinzhongxu /mnt/tencent

# 挂载远程文件系统到挂载点
sshfs jinzhongxu@tencent.test.com:/home/jinzhongxu /mnt/tencent -o allow_other -o reconnect

注意,挂载时因为指定了 reconnect 会断网自动重连;指定了 allow_other,就像普通的磁盘挂载一样。sshfs 默认情况下会阻止这种情况,所以建议带上该参数,否则将导致除 root 用户外其他用户无法访问文件系统。同时,指定该参数,需要在配置文件中放开权限,方法如下:

1
sudo vim /etc/fuse.conf

修改为如下:

1
2
3
4
5
6
7
8
# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)

# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#mount_max = 1000

# Allow non-root users to specify the allow_other or allow_root mount options.
user_allow_other

当挂载成功后,访问 /mnt/tencent 即可访问远程服务器 tencent.test.com 里的 /home/jinzhongxu 文件。

查看挂载情况

1
df -hT

有时,挂载的目录所有者为 nobody,所属组为 nogroup,我们可以使用下面的方法,改变所有者和所属组,假设所有者是jinzhongxu(uid=1000),所属组是 jinzhongxu (gid=1000),uid 和 gid 的查看方法为 id jinzhongxu

1
sshfs -o rw,default_permissions,allow_other,uid=1000,gid=1000,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 jinzhongxu@tencent.test.com:/home/jinzhongxu /mnt/tencent

卸载

1
2
3
fusermount -u /mnt/tencent
# or
sudo umount /mnt/tencent

永久挂载

上面的挂载方法通过 SSH 来实现,当连接断开后则挂载失效。因此,SSHFS 可以作为一种灵活的、临时的挂载方法。但想要永久挂载,可以进行如下配置来实现。

1
sudo vim /etc/fstab

在最后一行添加如下内容

1
sshfs#jinzhongxu@tencent.test.com:/home/jinzhongxu /mnt/tencent fuse.sshfs noauto,x-systemd.automount,_netdev,reconnect,identityfile=/home/jinzhongxu/.ssh/id_rsa,port=2222,allow_other 0 0

更新 fstab 文件使修改生效

1
sudo mount -a

参考文献

  1. 如何使用 SSHFS 通过 SSH 挂载远程的 Linux 文件系统或者目录
  2. linux sshfs挂载命令使用
  3. How To Use SSHFS to Mount Remote File Systems Over SSH
  4. ubuntu 远程挂载另一台ubuntu上的目录
  5. SSHFS远程目录自动挂载到本地目录 (纯干货 企业案例实操)【显哥出品,必为精品】 | 显哥博客
  6. sshfs 文件系统权限的一点笔记