写在前面
最近因为工作需求,需要把一台Ubuntu服务器的/mnt目录挂载到Windows本地,方便直接读写文件。
另外自己的codex配置在服务器上是公开的,不利于隐私性,而通过把代码挂载到自己windows上的方法可以直接使用自己电脑的codex修改挂载的代码,非常方便。
这篇文章把完整过程记录下来,每一步都经过实测验证,如果你也遇到类似场景,可以直接照抄。
一、最终效果
先看结果:
打开资源管理器,地址栏输入Z:\就能直接访问远程文件,跟操作本地硬盘一样。
二、为什么选这个方案
对目标服务器做了一轮端口探测:
网络可达 ✅
SSH端口开放 ✅(但不是默认22)
SMB 445端口 ❌ 未开放
NFS 2049/111端口 ❌ 未开放
既然只开放了SSH,最稳妥的方案就是:
Windows安装WinFsp + SSHFS-Win,通过SSHFS协议挂载
三、适用前提
开始之前,先确认你具备这些条件:
Windows能ping通Ubuntu服务器IP
Ubuntu已开启SSH服务
你有SSH用户名、密码、端口号
Windows有管理员权限安装软件
本次实测环境:
Windows PowerShell 5.1
Ubuntu服务器(IP已脱敏)
SSH用户:已脱敏
SSH端口:已脱敏(非默认22)
四、快速上手版(最简流程)
如果你不想看原理,直接按下面三步走。
第1步:安装WinFsp
在PowerShell(管理员模式)执行:
winget install --id WinFsp.WinFsp --source winget --accept-package-agreements --accept-source-agreements --silent
第2步:安装SSHFS-Win
winget install --id SSHFS-Win.SSHFS-Win --source winget --accept-package-agreements --accept-source-agreements --silent
第3步:执行挂载
net use Z: \\sshfs.r\用户名@服务器IP!端口号\mnt * /user:用户名 /persistent:yes
注意:把用户名、服务器IP、端口号替换成你自己的实际信息。*表示执行时手动输入密码,更安全。
执行后输入SSH密码,看到命令成功完成就搞定了。
五、详细实操记录(含踩坑排查)
下面是你这次真实经历的全过程,每一步都有验证。
5.1 测试网络连通性
Test-Connection -Count 2 服务器IP
✅ 主机可达
5.2 端口扫描
$results = foreach($p in 22,445,2049,111){ $r = Test-NetConnection -ComputerName 服务器IP -Port $p -WarningAction SilentlyContinue [PSCustomObject]@{ Port = $p; TcpTestSucceeded = $r.TcpTestSucceeded }}$results
结果:
22 ❌ 不通
445 ❌ 不通
2049 ❌ 不通
111 ❌ 不通
后来查了本地~/.ssh/config配置才发现,SSH实际跑在非默认端口上。
5.3 确认SSH配置
查看本机C:\Users\你的用户名\.ssh\config,里面写着:
Host 别名 HostName 服务器IP User 用户名 Port 端口号
这一步很关键——确认了正确的用户名和端口。
5.4 测试SSH登录
ssh -p 端口号 用户名@服务器IP "echo OK"
如果提示Permission denied (publickey,password),说明公钥没配,但允许密码登录,那就直接用密码方式挂载。
5.5 安装软件
两条winget命令顺利执行完成。安装后检查关键文件:
Get-ChildItem 'C:\Program Files\SSHFS-Win\bin\sshfs.exe'
文件已落地,组件到位。
5.6 挂载成功
net use Z: \\sshfs.r\用户名@服务器IP!端口号\mnt 密码 /user:用户名 /persistent:yes
返回:
5.7 验证挂载
显示:
查看目录:
看到了sata1和usb两个子目录,说明读取正常。
六、权限问题定位
根目录为什么不能写?
尝试往Z:\根目录写测试文件:
Set-Content Z:\test.txt -Value 'test'
报错:拒绝访问。
原因分析:这不是挂载失败,而是服务器端/mnt目录权限为drwxr-xr-x root root,SSH用户只有读权限,没有写权限。
而子目录/mnt/sata1权限为drwxrwxrwx,可读可写。
验证写入
$testFile = 'Z:\sata1\test.txt'Set-Content $testFile -Value '写入成功'Get-Content $testFileRemove-Item $testFile
✅ 创建、读取、删除全部成功。
结论:挂载没问题,根目录不可写是服务器权限策略,不是Windows端的锅。
七、标准操作流程(以后照做)
挂载(推荐手动输密码)
net use Z: \\sshfs.r\用户名@服务器IP!端口号\mnt * /user:用户名 /persistent:yes
查看挂载状态
Get-PSDrive ZGet-ChildItem Z:\
取消挂载
更换盘符
把Z:换成Y:即可:
net use Y: \\sshfs.r\用户名@服务器IP!端口号\mnt * /user:用户名 /persistent:yes
八、常见问题与解决
❌ 问题1:Permission denied
现象:公钥登录失败
原因:服务器未信任你的公钥,但允许密码登录
解决:直接用密码方式挂载,或把公钥加到服务器的~/.ssh/authorized_keys
❌ 问题2:Z盘根目录不能写
现象:能打开Z盘,但创建文件报权限错误
原因:服务器/mnt目录属主是root,当前用户只有读权限
解决:
写到有权限的子目录,如Z:\sata1
或在服务器上创建一个专属共享目录:
sudo mkdir -p /mnt/sharesudo chown 用户名:用户名 /mnt/share
之后Windows写Z:\share即可。
❌ 问题3:安装SSHFS-Win看起来卡住了
现象:winget下载完安装包,msiexec进程长时间挂着
解决:
先检查文件是否已落地:C:\Program Files\SSHFS-Win\bin\sshfs.exe
直接测试net use能否挂载
如果确实没装好,重启后重新安装
❌ 问题4:默认22端口不通
现象:以为SSH服务没开
原因:服务器把SSH改到了非默认端口
解决:检查本地~/.ssh/config或直接测试正确端口:
Test-NetConnection 服务器IP -Port 端口号
❌ 问题5:net use成功了,但资源管理器看不到
现象:命令行显示成功,net use能看到盘符,但“此电脑”里没显示
原因:Windows资源管理器没有立刻刷新网络位置
解决:
直接在地址栏输入Z:\回车
或者重启资源管理器:
Stop-Process -Name explorer -ForceStart-Sleep -Seconds 2Start-Process explorer.exe
九、推荐优化方案
优化1:创建专用共享目录
在服务器上:
sudo mkdir -p /mnt/sharesudo chown 用户名:用户名 /mnt/sharechmod 755 /mnt/share
以后Windows里稳定读写Z:\share。
优化2:配置免密登录
Windows生成公钥:
mkdir -p ~/.sshchmod 700 ~/.sshecho "公钥内容" >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys
搞定后挂载不再需要输密码。
十、完整命令清单(直接复制)
安装组件
winget install --id WinFsp.WinFsp --source winget --accept-package-agreements --accept-source-agreements --silentwinget install --id SSHFS-Win.SSHFS-Win --source winget --accept-package-agreements --accept-source-agreements --silent
挂载
net use Z: \\sshfs.r\用户名@服务器IP!端口号\mnt * /user:用户名 /persistent:yes
查看
Get-PSDrive ZGet-ChildItem Z:\
卸载
写在最后
本次挂载已成功完成,核心结论:
✅ Windows到Ubuntu的/mnt成功挂载为Z盘
✅ Z盘可正常读取
✅ 子目录Z:\sata1可读可写
⚠️ Z盘根目录不可写——是服务器权限限制,非挂载异常
正常情况下挂载后windows资源管理器是能直接看到该文件夹的。