使用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"]来取消警告。

浙公网安备 33010602011771号