本文完整阅读约需 12 分钟,如时间较长请考虑收藏后慢慢阅读~

在进行Linux服务器维护时,文件管理一直是一个比较棘手的问题:FTP/SMB/WebDAV安装步骤繁琐,且用户权限等配置也较为复杂,最重要的是以上几种传输协议默认都是不加密的,配置加密等操作又要付出额外的时间与精力。OpenSSH自带的SFTP能做到开箱即用,且自带加密,但SFTP毕竟只是文件传输协议,在Linux下我们可以使用sshfs配合FUSE将其作为磁盘挂载,在Windows下同样有sshfs-win帮助我们实现这一功能。本文将为读者讲解sshfs-win的原理、安装、使用以及使用过程中一些需要注意的细节。

0x01 sshfs-win原理介绍

Windows下的sshfs-win与Linux下的sshfs原理基本一致,即它们都是建立在用户空间文件系统的基础上的应用。

sshfs将SFTP协议转换为FUSE的接口,FUSE再将这一接口以文件系统的方式暴露给内核;而sshfs-win则将SFTP协议转换为WinFSP(Windows文件系统代理)提供的接口,WinFSP所做的事情大致可以列举为以下三件:

  1. 注册一个设备驱动,让Windows能够挂载它
  2. 实现NT内核下CreateFile、ReadFile、WriteFile等API,管理读写队列
  3. 调用挂载到WinFSP上应用程序对应的FUSE接口

Windows的内核扩展与驱动程序非常复杂,因此为Windows开发内核态文件系统需要比在Linux下开发内核态文件系统更多的精力,而WinFSP作为FUSE接口到Windows文件系统的桥梁(这就是名字里代理的由来),能以更加全面与完整的API,以及对FUSE良好的兼容性,降低文件系统开发的难度。

WinFSP的具体原理与机制可以参考WinFSP的文档,此处不再赘述,接下来我们开始讲解如何安装与使用依赖WinFSP的sshfs-win。

0x02 sshfs-win安装与使用

上文提到,sshfs-win依赖WinFSP,因此我们要首先安装WinFSP:https://github.com/billziss-gh/winfsp

WinFSP安装结束后,我们再安装sshfs-win:https://github.com/billziss-gh/sshfs-win

两者都安装完毕后,我们在Windows的文件资源管理器中点击『映射网络驱动器』:

在弹出的对话框中,我们选定需要赋予的盘符,然后在文件夹中输入如下内容:

\\sshfs\用户名@IP地址!端口号

需要注意的是这里端口号不是我们通常使用的:,而是!,点击完成后,输入用户名对应的密码即可连接成功。

0x03 一些需要注意的细节

尽管sshfs-win的操作较为简单,但如果你想做更多操作,就会发现各种各样奇奇怪怪的『BUG』,因此这一节笔者将为大家列举两个需要注意的细节。

1. 如何挂载子目录

默认情况下,我们在输入第二节提到的连接串后,会将用户的家目录映射到Windows中,如果我们只是为了管理网站目录、做做备份或者是作为NAS使用,可能需要挂载其他子目录,但这时我们可能会发现,使用如下的连接串会导致连接时出现『位置不可用』的报错:

\\sshfs\用户名@IP地址!端口号\home

这是因为连接串中的路径是以用户家目录为参考的相对路径,即如果我们需要映射/home目录,则需要使用如下连接串

\\sshfs\用户名@IP地址!端口号\..\..\home

其中..\的数量需要根据实际情况决定,这样就能成功映射到我们所需的目录

这样的方式很容易造成误解,也让连接串变得复杂,因此sshfs-win支持另一种更为简明的连接串语法:

\\sshfs.r\用户名@IP地址!端口号\home

这里的r指的是root,即默认从根目录挂载而非家目录,这样就无需使用丑陋的..\回到根目录,我们可以直接从根目录开始,输入绝对路径来挂载我们所需的文件夹。

其实除了sshfs.r以外,还有其他的一些连接串规则能帮助sshfs-win变得更加方便,具体可以参考:https://github.com/billziss-gh/sshfs-win#unc-syntax

2. 如何取消挂载

笔者在使用sshfs-win的时候,经常出现无法卸载盘符的情况,无论通过文件资源管理器右键断开连接,还是通过cmd执行net use 盘符: /delete操作,均会在提示卸载成功后发现盘符依旧存在。

根据这篇Issue:billziss-gh/sshfs-win#119,这可能是由于和其他应用程序的冲突引起。冲突可能不便解决,但我们可以利用上文描述过的原理,即WinFSP为sshfs提供支持,从WinFSP的角度下手解决这个问题。

我们打开命令提示符(或者PowerShell,取决于你的喜好),定位目录到WinFSP的安装目录,默认应该是C:\Program Files (x86)\WinFsp\bin\,然后执行如下命令:

.\launchctl-x64.exe list

这时它会列出正在运行的挂载任务,如下图:

这里可以看到,第一个挂载任务的语法存在错误,这可能是导致它无法正常取消挂载的原因,这时候我们可以执行如下命令来取消挂载:

 .\launchctl-x64.exe stop sshfs root@xxx...

命令执行成功后,我们打开文件资源管理器就会发现之前无法取消挂载的盘符已经成功消失。

0x04 其他的替代品

尽管sshfs-win简单直接,但如果读者需要更多功能(如图形界面、缓存等),就需要其他的替代品来实现同样的功能。这里笔者推荐几款替代品:

  • rclone:一款号称『挂载任何存储服务』的跨平台开源软件,支持范围之广从Amazon S3到Google Drive,或者是更为传统的FTP、SFTP,甚至内存!rclone提供了超过30种存储目标,并提供充分的自定义选项支持,可以实现缓存、权限等复杂配置。美中不足的是rclone并未提供图形界面,而在Windows下编写服务配置文件较为复杂,因此该软件适合有较多自定义需求的用户使用。

  • raidrive: raidrive相对比rclone最大的特色就是提供了图形界面支持,可以更方便地管理挂载目录,但这是一款商业软件,免费套餐只支持较少的挂载目标,也无法支持缓存等高级功能。

类似的软件还有很多,如SFTP Drive等,读者可以根据自己的需求挑选适合自己的软件。

需要注意的是,这些软件的原理大多类似,其中还有不少是基于WinFSP的二次开发,因此在性能和稳定性方面,它们是相差不多的。