跨机-挂载-SSHFS-远程目录本地化

事情是这样的。

今天又在服务器上改一份配置,本地编辑器里改着舒服,结果文件在远端。来回 scp,改一行传一次,传完再 ssh 上去看一眼日志。来回两趟人就烦了。

我寻思了一下:能不能让远端那个目录,直接出现在我本机某个路径里?本地打开、保存,实际落在服务器上。摸到 SSHFS(SSH Filesystem,SSHFS)之后试了下,还行,至少把「改配置 / 瞄日志」这类小事从拷文件地狱里捞出来了。所以记一笔,分享给也经常 SSH 上机器抠文件的朋友。

它干的事其实就一件:走安全外壳协议(Secure Shell,SSH)里的 SSH 文件传输协议(SSH File Transfer Protocol,SFTP),再借用户态文件系统(Filesystem in Userspace,FUSE)把远程目录挂到本机路径。多数 OpenSSH 默认就开着 SFTP,服务器那边通常不用再装东西、也不用再开端口。

段末注释:SSHFS 指「SSH 文件系统」客户端;FUSE 指在用户态做文件系统挂载;SFTP 是跑在 SSH 通道上的文件访问协议(不是 FTP 的加密版)。后文沿用缩写。

回到开头那个痛:远端有文件,本地想当普通文件夹用。SSHFS 就是冲这个来的。

我觉得适合啥时候用

你如果也经常 SSH 上机器,下面这些场景,我自己用下来觉得挺对口:

  • 本机 IDE / 编辑器直接打开远端项目或配置目录,改几处就跑,不想整仓同步下来。
  • 临时挂到 ~/mnt/...,拖两下文件,或者丢给本地小脚本瞄一眼。
  • 防火墙只放行 SSH,NFS / Samba 那种共享盘申请不动、也懒得申请。
  • 本机用普通用户挂就行,挂载点目录归自己,不必动不动 sudo。

舒适区就四个词:偶发、交互式、已有 SSH、能忍一点网络延迟。再大再重的活,往下看「别用」。

啥时候我建议你别用

这块需要注意一下,我自己也踩过预期管理的坑:

你其实想干的事 我更愿意换的方向
大批量、可重复拷贝 / 增量同步 rsync 这类传输工具
局域网长期共享、多人同时写 NFS、SMB(要动服务端)
WAN 上对着巨大目录狂 ls、扫元数据 先同步到本地,或换延迟更可控的方案
当生产数据盘,断网也不能含糊 别指望 SSHFS
指望社区天天修边角 bug 官方现在偏维护向,别幻想「提 issue 必回」

说真的,发行版里到处能装到它,用的人也多。但坦率的讲,当前贡献节奏不猛,已知问题一堆。长期当核心依赖之前,你自己心里要有 B 计划。

原理就这一小截

真要知道故障大概出在哪,看这条链就够了:

1
2
3
4
本机应用 → 本地路径(FUSE 挂载点)
→ sshfs 进程
→ SSH 上的 SFTP
→ 远端真实目录

stat、列目录这类动作,往往就是一次网络往返。局域网还好;链路一慢、目录一大,体感会劝退。这不是你没调优,是这玩法天生带延迟税。扣回主线:它解决的是「路径语义」,不是「把网盘变成本地盘」。

我怎么装、怎么挂上

安装

1
2
3
4
5
6
7
8
# Debian / Ubuntu
sudo apt install sshfs

# RHEL / Fedora 系(包名因版本可能叫 fuse-sshfs)
sudo dnf install fuse-sshfs

# macOS:先有 FUSE 实现(比如 macFUSE),再用 Homebrew 等装 sshfs
brew install sshfs

当然也可以源码安装

1
2
3
4
5
6
7
8
9
10
11
12
$ git clone https://gitcode.com/gh_mirrors/ss/sshfs
$ cd sshfs

$ mkdir build; cd build
$ meson ..

$ mesonconf # list options
$ mesonconf -D strip=true # set an option

$ ninja
$ python3 -m pytest test/ # optional, but recommended
$ sudo ninja install

包名以你发行版为准。Windows 原生体验一般,我会改用 SFTP 客户端、WSL 里的 sshfs,或者 IDE 远程开发,不强求本机硬挂。

挂载

1
2
3
mkdir -p ~/mnt/remote-proj
# 远端路径省略的话,默认挂远程用户家目录
sshfs user@host:/path/on/server ~/mnt/remote-proj

常用变体:

1
2
sshfs -o port=2222 user@host:/data ~/mnt/remote-proj
sshfs mybox:~/work ~/mnt/remote-proj # 吃 ssh config 里的 Host 别名

卸载

1
2
3
4
5
6
7
# Linux 常见
fusermount -u ~/mnt/remote-proj
# 有的环境
umount ~/mnt/remote-proj

# macOS / BSD
umount ~/mnt/remote-proj

编辑器还开着挂载点里的文件时,卸载会失败。先关占用,再卸。这个事儿我也烦过 = =

真用起来我会加的几个选项

笔记本一休眠、Wi-Fi 闪一下,默认挂载很容易留个「假活」的挂载点,点进去无响应。交互式用的时候,我会带上保活和重连:

1
2
sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 \
user@host:/path/on/server ~/mnt/remote-proj
  • 保活:让 SSH 更早发现死连接。
  • reconnect:断了会尝试重连。注意,这不等于本地盘那种事务保证,偶发还是得手动卸了重挂。
  • 压缩、加密套件可以继续在 ssh_config / -o 里抠;WAN 上开压缩未必更快,我自己是有空再测,没空就默认。

/etc/fstab 自动挂?可以,但要密钥登录,还要防开机卡死。固定内网机子或许值得;笔记本移动办公,我更愿意手动或丢个小脚本。

跟别的办法怎么挑

方案 服务端额外折腾 形态 我啥时候会选
SSHFS 通常不用 挂成路径 临时编辑、浏览、小规模读写
scp / sftp 客户端 不用 拷贝 / 会话浏览 传一次就完,不需要路径语义
rsync 不用(守护进程可选) 同步镜像 批量、增量、反复搬
NFS / SMB 要配 真共享盘 局域网、长期、多客户端
IDE Remote 等 不用 编辑器里远程开 主要写代码,很少让任意本地程序碰挂载点

口诀我自己记的是:要「像本地路径」又改不动服务端 → 先试 SSHFS;要「搬数据」→ rsync;要「多人长期盘」→ NFS/SMB。不是谁吊打谁,是场景不对齐。

限制、风险、我不确定的

  1. 大目录列举、递归扫盘,元数据请求会炸延迟,WAN 上可能慢到你怀疑人生。
  2. 多个人同时写同一棵树,别默认它跟专用网络盘一样稳。
  3. 断线后挂载点可能假死,需要 fusermount -u / umount;lazy 卸载能救急,但动手前想清楚。
  4. 维护状态以 libfuse/sshfs 为准。我说「偏维护向」是看 README 和 issue 氛围得出的印象,具体版本你以仓库为准。
  5. 流量走 SSH,安不安全取决于你的 SSH 怎么配。官方有个 directport 直连玩法,明文,只适合本机或受控网实验,别对着公网开。

有些边角我自己也没全跑通,不确定的地方我就不装懂。

收个尾

已经能 SSH、又只是想让本机工具直接啃远端某一棵目录树——我觉得 SSHFS 值得一试,部署轻、心智负担小。

请你把它当成「临时接出来的远端文件夹」,别当成「可靠网盘」。一旦变成大批量同步、低延迟共享、或多写者生产数据,换 rsync 或 NFS/SMB,别跟自己过不去。

资料:

-------------本文结束感谢您的阅读-------------