使用WSL下的sshfs访问远程文件系统

WSL是一种在Windows设备上运行Linux子系统的方法,其新版(WSL2)可以运行完整的Linux内核。

sshfs是一种文件系统,它能够借助Linux内核的功能,将远程存储挂载为本地文件系统。

结合Windows对WSL文件系统的支持,我们可以Windows的资源管理器下直接访问远程设备存储。

本文将介绍通过配置一个极小的WSL Alipine实例来实现远程ssh文件系统挂载和通过Windows资源管理器便捷访问。如果你已经配置了WSL2实例,也可以借助现有的WSL2实例实现。

在WSL中配置Alpine

Alpine Linux的Mini root filesystem分发版是一个极小但完整的Linux系统,其基础分发版的总体积不到10MB,而已经能够满足我们的需求。

如果你从来没有使用过WSL,需要先启用WSL组件。在PowerShell中运行

wsl --install --no-distribution

系统会自动完成wsl组件的下载和配置。

Alpine下载页下载Mini root filesystem的镜像,并导入到WSL中

wsl --install --name Alpine --from-file alpine-minirootfs-latest-x86_64.tar.gz

之后进入Alpine实例并安装sshfs

wsl -d Alpine
apk add sshfs

这样WSL实例的配置就完成了

配置ssh密钥登录

为了能够快速登录远程设备,我们需要在Alpine和远程设备上分别配置密钥。

一对ssh密钥由私钥和公钥两个文件组成,它们是两段不同的复杂的随机文本。一段数据由公钥加密后可以由其对应的私钥解密还原,而在没有私钥的情况下,仅根据公钥和密文的来推断加密前的数据则被认为是不可实现的。所以,密钥可被用于身份验证:用户在服务器端和客户端分别存储公钥和私钥,需要身份验证时,服务器端将一段加密后的文本发送到客户端,客户端将通过私钥将密文解密后发回服务器端,如果服务器端收到的文本与加密前的文本一致,用户身份即得以验证。

ssh的相关配置通常保存在~/.ssh文件夹下。用户可以在~/.ssh/config预设远程主机的登录参数,从而简化命令行登录时需要传递的参数。

例如,在~/.ssh/config配置以下条目

Host my-remote
  HostName 172.21.223.18
  User my-name
  Port 8022
  IdentityFile ~/.ssh/my-remote.id_ed22519

即可通过命令ssh my-remote,尝试向172.21.223.18主机8022端口上的ssh服务,以my-name的用户身份、~/.ssh/my-remote.id_ed22519为登录密钥登录。

为了能够以密钥方式成功登录,我们需要在Alpine上放置私钥文件~/.ssh/my-remote.id_ed22519,并将对应的公钥添加到172.21.223.18主机上my-name用户的~/.ssh/authorized_keys中。

如果你从未配置过ssh密钥登录,可以在Alpine上通过ssh-keygen生成一对密钥。并通过ssh-copy-id把公钥传输到远程设备上。在Alpine中运行

ssh-keygen -t ed25519 -N "" -f ~/.ssh/my-remote.id_ed25519
ssh-copy-id -i ~/.ssh/my-remote.id_ed25519 my-remote

ssh-copy-id会要求你通过密码进行一次ssh登录,之后会自动将公钥添加到远程设备的~/.ssh/authorized_keys中。配置好ssh密钥后,即可在命令行通过ssh my-remote直接登录到远程设备。

在Alpine中挂载和打开远程目录

完成登录配置后,即可通过sshfs将远程文件系统挂载到WSL实例中。我们先通过mkdir -p创建挂载点,然后通过sshfs进行挂载:

mkdir /remote/my-remote
sshfs -o reconnect,ServerAliveInterval=15,follow_symlinks my-remote:/ /remote/my-remote

这样就可以在WSL实例的/remote/my-remote目录下访问到远程设备根目录下的文件。

挂载成功后,我们可以将Windows资源管理器导航到\\wsl.localhost\Alpine\remote\my-remote以访问和浏览远程设备根目录下的文件系统。

或者,我们也可以WSL中直接调用explorer.exe以启动资源管理器并导航到对应位置。注意explorer.exe只支持Windows风格的目录格式,因此还需要通过wslpath -w转换WSL路径。

explorer.exe `wslpath -w /remote/my-remote`

在Alpine中配置导航脚本

我们可以用一个脚本来自动处理挂载和打开资源管理器的过程。在这里,我们通过自定义的sshfs://URL格式传递要挂载的路径,在/usr/local/bin下创建一个名为navigate-to的脚本,内容如下:

#/bin/sh
target=$1
case "$target" in
  sshfs://*)
    target=${target#*://}
    host=${target%%/*}
    path=${target#*/}
    target=/remote/$host
    if ! mountpoint "$target" >/dev/null 2>&1; then
      mkdir -p "$target"
      if ! sshfs -o reconnect,ServerAliveInterval=15,follow_symlinks "$host:/" "$target"; then
        rmdir "$target"
        exit 1
      fi
    fi
    target=$target/$path
  ;;
  *)
    echo "invalid scheme"
    exit 2
esac
[ -f "$target" ] && target=$(dirname "$target")
[ -d "$target" ] && explorer.exe "$(wslpath -w "$target")" || true

将其设置为可执行:

chmod +x /usr/local/bin/navigate-to

之后在Alpine中运行navigate-to sshfs://my-remote//path/to/directory,即可自动挂载远程文件系统,并在Windows资源管理器中打开对应目录。

在注册表注册URL scheme

Windows可以通过注册表指定一个URL scheme的打开方式,这样我们就可以通过运行或点击打开我们自定义的sshfs链接,直接在Windows资源管理器中访问远程文件系统。

在cmd中运行

reg add "HKCU\Software\Classes\sshfs" /ve /d "URL:sshfs" /f
reg add "HKCU\Software\Classes\sshfs" /v "URL Protocol" /f
reg add "HKCU\Software\Classes\sshfs\shell\open\command" /ve /d "\"C:\WINDOWS\system32\wsl.exe\" -d Alpine navigate-to \"%1\"" /f

上述命令会在HKEY_CURRENT_USER\Software\Classes\sshfs下创建一个新的条目,允许我们通过sshfs://协议来调用WSL中的Alpine实例,并执行navigate-to命令。

注册成功后,在运行窗口(Win+R)输入链接sshfs://my-remote//tmp并回车,Alpine即会通过sshfs自动挂载my-remote的远程文件系统,并启动一个资源管理器窗口导航到其对应的/tmp目录下。

利用OSC 8在终端显示sshfs链接

OSC 8是一种在终端中显示超链接的方法。转义序列\e]8;;链接地址\a链接文本\e]8;;\a在受支持的终端中将显示为一个超链接链接文本

Windows Terminal支持OSC 8序列,单击链接将会通过系统注册的默认链接打开方式打开对应链接。

~/.bashrc中定义函数rp用于输出带链接的文件路径

rp(){
	local wd=${1-.}
	[[ $wd == /* ]] || wd="$PWD/$wd"
	wd=$(realpath --no-symlinks "$wd")
	printf '\e]8;;sshfs://%s/%s\a%s\e]8;;\a\n' "$HOSTNAME" "$wd" "$wd"
}

然后就可以在bash中通过rp /path/to/file输出带链接的路径。

或者,直接将命令提示符(PS1变量)中的路径提示\w替换为\[\033]8;;sshfs://$HOSTNAME/$PWD/\007\]\w\[\033]8;;\007\],例如

export PS1='\[\033]0;\u@\h:\w\007\]\[\033[01;32m\]\u@\h\[\033[01;34m\] \[\033]8;;sshfs://$HOSTNAME/$PWD/\007\]\w\[\033]8;;\007\] \$\[\033[00m\]'

从而将命令提示符中的路径变成带链接的路径。

在受支持的终端(如Windows Terminal)中,对应的路径将显示为 /path/to/file ,按住ctrl点击后可以在Windows资源管理器中打开对应目录。

Windows Terminal默认会在每次点击自定义scheme链接时弹出警告,可以在设置中配置"safeUriSchemes": ["sshfs"]来取消警告。

posted @ 2026-09-23 10:07  Fan-iX  阅读(16)  评论(0)    收藏  举报