当前位置: 首页 > Linux

[小技巧]在Windows下使用sshfs-win挂载sftp磁盘到本地,便捷管理Linux中的文件

时间:2023-04-06 18:15:18 Linux

[Tips]Windows下使用sshfs-win将sftp磁盘挂载到本地,方便Linux下管理文件步骤繁琐,用户权限的配置也比较复杂。最重要的是,上述传输协议默认是不加密的,配置加密等操作需要额外的时间和精力。OpenSSH自带的SFTP可以开箱即用,自带加密功能,但SFTP毕竟只是一种文件传输协议。在Linux下,我们可以使用sshfs配合FUSE将其挂载为磁盘。在Windows下,还有sshfs-win帮助我们实现这一点。本文将为读者讲解sshfs-win的原理、安装、使用以及使用过程中需要注意的一些细节。本文原发于某无名小站,作者本人同步至知乎。转载请注明原作者博客地址或此链接,谢谢!0x01sshfs-win原理介绍Windows下的sshfs-win原理与Linux下的sshfs基本相同,即都是基于用户空间文件系统的应用。sshfs将SFTP协议转换成FUSE接口,然后FUSE将这个接口以文件系统的形式暴露给内核;而sshfs-win将SFTP协议转换成WinFSP(WindowsFileSystemAgent)提供的接口,WinFSP创建的东西大致可以列为以下三样东西:注册一个设备驱动,让Windows挂载它实现API如NT内核下的CreateFile、ReadFile、WriteFile,管理读写队列,调用WinFSP上挂载的应用程序对应的FUSE接口。内核扩展和驱动程序非常复杂,因此为Windows开发内核模式文件系统比在Linux下开发内核模式文件系统需要更多的努力,而WinFSP充当了FUSE接口到Windows文件系统的桥梁(这是名称中代理的由来),可以降低文件系统的开发难度,更全面完整的API,与FUSE良好的兼容性。WinFSP的具体原理和机制可以参考WinFSP文档,这里不再赘述。接下来,我们将介绍如何安装和使用依赖于WinFSP的sshfs-win。0x02sshfs-win的安装和使用上面说了sshfs-win依赖WinFSP,所以我们需要先安装WinFSP:https://github.com/billziss-gh/winfsp。WinFSP安装完成后,我们再安装sshfs-win:https://github.com/billziss-gh/sshfs-win。两者安装完成后,我们在Windows文件资源管理器中点击“映射网络驱动器”:在弹出的对话框中,我们选择需要分配的盘符,然后在文件夹中输入以下内容:\\sshfs\用户名@IP地址!端口号需要注意的是,这里的端口号不是我们平时使用的:,而是!,点击完成后,输入用户名对应的密码即可连接成功。0x03Somedetailsthatneedattentionsshfs-win的操作虽然比较简单,但是如果想进行更多的操作,就会发现各种奇怪的“BUG”,所以这一节我会列出两个需要注意的Details。1.如何挂载子目录默认情况下,输入第二节中提到的连接字符串后,用户的主目录将映射到Windows。如果我们只是想管理网站目录,做备份,或者作为NAS使用的话,可能需要挂载其他子目录,但是这时候我们可能会发现使用下面的连接串会报错连接时“locationunavailable”的:\\sshfs\用户名@IP地址!端口号\home这是因为连接字符串中的路径是相对于用户home目录的路径,即如果我们需要映射/home目录,我们需要使用下面的连接字符串\\sshfs\用户名@IP地址!端口号\..\..\home..\的个数需要根据实际情况来定,这样就可以成功映射到我们需要的目录下了。这种方式容易引起误解,使连接字符串复杂化,所以sshfs-win支持另一种更简洁的连接字符串语法:\\sshfs.r\用户名@IP地址!portnumber\home其中r指的是root,即默认是从根目录挂载,而不是从home目录挂载,这样就不用丑陋的..\回到根目录,我们直接启动即可从根目录,输入绝对路径来挂载我们需要的文件夹。事实上,除了sshfs.r,还有其他的连接字符串规则可以帮助sshfs-win变得更加方便。详情请参考:https://github.com/billziss-gh/sshfs-win#unc-syntax。2、如何取消挂载笔者在使用sshfs-win时,经常会出现盘符无法卸载的情况。不管是通过文件资源管理器右键断开连接,还是通过cmd执行netusedriveletter:/delete操作,提示卸载成功后发现盘符依然存在。根据这个Issue:billziss-gh/sshfs-win#119,这可能是与其他应用程序发生冲突造成的。冲突可能不方便解决,但是我们可以利用上面介绍的原理,即WinFSP提供了对sshfs的支持,从WinFSP的角度来解决这个问题。我们打开命令提示符(或者PowerShell,看你喜欢),定位到WinFSP的安装目录,默认应该是C:\ProgramFiles(x86)\WinFsp\bin\,然后执行以下命令:.\launchctl-x64.exelist此时会列出正在运行的挂载任务,如下图:这里可以看到第一个挂载任务的语法有错误,可能是无法正常卸载的原因。这时我们可以执行如下命令取消挂载:.\launchctl-x64.exestopsshfsroot@xxx...命令执行成功后,我们会发现之前无法卸载的盘符已经成功了,当我们打开文件资源管理器时就消失了。0x04Otheralternatives虽然sshfs-win简单直接,但是如果读者需要更多的功能(比如图形界面,缓存等),就需要其他的alternatives来实现同样的功能。在这里我推荐几个备选方案:rclone:一款名为“挂载任何存储服务”的跨平台开源软件,支持范围广泛,从AmazonS3到GoogleDrive,或者更传统的FTP、SFTP,甚至内存!rclone提供了30多种存储目标,并全面支持自定义选项,可以实现缓存、权限等复杂配置。美中不足的是rclone不提供图形界面,在Windows下编写服务配置文件比较复杂,所以这款软件适合有更多定制化需求的用户。raidrive:与rclone相比,raidrive最大的特点是提供了图形界面支持,可以更方便的管理挂载目录。不过这是一款商业软件,免费包只支持较少的挂载目标,无法支持高级缓存等功能。类似的软件还有很多,比如SFTPDrive等,读者可以根据自己的需要选择适合自己的软件。需要注意的是,这些软件的原理大多相似,很多都是基于WinFSP进行二次开发,所以在性能和稳定性上都差不多。