VS Code 远程文件传输慢,寻找替代方案

说明

从 Windows 的资源管理器拖动文件到连接到远程服务器的 VS Code 窗口,或者从 VS Code 文件目录下载文件,速度都比 scp 慢得多(3M/s VS 20M/s)。此文章尝试寻求其他替代方案。

rsync

macOS/Linux

参考 Remote Development Tips and Tricks,在 Linux/macOS 上面比较方便。

rsync -rlptzv --progress --delete --exclude=.git "user@hostname:/remote/source/code/path" .

Windows 使用 WSL 的 rsync

在 Windows 上面比较麻烦,VS Code 给出的教程是:

wsl rsync -rlptzv --progress --delete --exclude=.git "user@hostname:/remote/source/code/path" "`$(wslpath -a '$PWD')"

有问题:Windows 的 ssh 配置和 wsl 并不相通。参考其他资料:

结果改成:

# Powershell
wsl rsync -rlptzv --progress --delete --exclude=.git \
    -e "ssh -F /mnt/c/Users/alex/.ssh/config" \
    amax150-xx:/home/xx/projects/minimind/images \
    "`$(wslpath -a '$PWD')"
# WSL
rsync -rlptzv --progress --delete --exclude=.git \
    -e "ssh -F /mnt/c/Users/alex/.ssh/config" \
    amax150-xx:/home/xx/projects/minimind/images .

但现在还有问题,找不到公钥,只有配置文件,导致登录时需要输入密码

Windows 上尝试 MSYS2 的 rsync

同样是用不了默认的配置文件。

rsync -rlptzv --progress --delete --exclude=.git \
    -e "ssh -F /c/Users/alex/.ssh/config" \
    amax150-xx:/home/xx/projects/minimind/images .

还是会让输入密码,和 WSL 差不多。

Windows 上尝试 scoop 的 rsync

优点是可以用默认的配置文件。

scoop install cwrsync

命令在 C:\Users\alex\scoop\apps\cwrsync\current\bin\rsync。出错:

参考 ssh - rsync error: error in rsync protocol data stream (code 12) at io.c(600) sender=3.0.6 - Server Fault 尝试:

  1. 检查对端是否安装 rsync(已安装)。
  2. 对端 rsync 路径是否标准(标准),不然要加 --rsync-path 参数。
  3. 本机 rsync 和 ssh 是否配套。✔

第 3 点确实能解决一部分问题。保证 rsync 和 ssh 配套要加上 -e 选项给定绝对路径。

rsync -e 'C:\Users\alex\scoop\apps\cwrsync\6.4.0\bin\ssh.exe' yourserver:/tmp/abc.txt .

直接登录的成功了:

使用跳板机的失败了(这里给 ssh 加了 -vv 选项观察原因):

发现找不到密钥,然而密钥是从 ssh 配置文件中指定的。登录第一个服务器的时候能解析出来其密钥,把第二个服务器当成跳板登录第二个服务器的时候就无法从配置文件中解析出来密钥路径了。

尝试添加 -F 选项指定配置路径,结果没有变化。总体上来说更加不顺利,用跳板机连密码都不让输入就失败了

scp

先把文件打包成 tar 然后用 scp 进行传输。Windows 的 scp 支持是正常的,能正常解析 hostname 和处理密钥,但是会有压缩和解压的额外操作。

如果不愿意压缩,scp 会对每个文件都发起一次 ssh 请求,这样多文件传输的速度会比较慢。

总结

macOS 和 Linux 上面直接用 rsync 就可以。

Windows 上面:

  1. WSL 和 MSYS2 的 rsync 涉及到不使用相同配置的问题,需要手动指定配置文件,并且密钥无法识别,需要输入密码。
  2. Scoop 中的 rsync 使用起来更加麻烦,效果也不好。
  3. 先打包再用 scp 传输。