如何将文件从我的 WSL 目录复制到只能通过 Windows SSH 连接的机器

如何将文件从我的 WSL 目录复制到只能通过 Windows SSH 连接的机器

我有一台服务器,我想将一些文件复制到该服务器,但我只能通过 tailscale 访问该服务器,并且只有我的 Windows 计算机地址在该 VPN 上注册,而不是该计算机上的 WSL 发行版。因此,我无法直接从 WSL ssh(或运行 rsync)到服务器。我可以从 Windows 计算机 ssh,并且可以使用 vscode 连接到它(和 WSL 发行版)(尽管我想要复制的文件位于我的 WSL 主目录中,而不是我通常在该发行版上访问的 git 存储库中)。

因此,我有点不知道如何复制文件(这是一个 tgz 文件(gzip 压缩的 tar 文件),如果这有区别的话)。似乎应该有一种简单的方法可以做到这一点,但我不知道它是什么。

答案1

似乎应该有一个简单的方法来实现它

嗯,不完全是——那里有相当多的挑战,例如:

  • 显然,WSL2 使用了不同的 IP,而远程主机不会接受
  • 通过 VPN 连接时,WSL2 实例可能会不得(取决于 VPN 配置)能够与 Windows 部分(甚至网络)通信。

我能想到的一些解决方案:

  • 当然,最简单的方法是先将文件从 WSL 发行版复制到 Windows 主目录,使用以下命令(从 WSL2 内部的 Bash 中):

    cp file.tgz /mnt/c/Users/<your_windows_user>/Documents/
    

    ...然后scp将文件从 Windows 传输到远程主机。

    当然,可能有一些理由不建议这样做,比如文件的大小。或者,也许文件是在你连接到远程主机时实时生成的。

  • 一种非常有趣的技术是简单地将文件从 WSL 传输到 PowerShell,再传输到 SSH 命令,再传输到远程主机。但是,这要求在命令期间没有密码质询 - 换句话说,如果您配置了公钥身份验证(甚至(假设您不控制远程主机),那么以下内容将在 WSL 中起作用:

    cat filename | powershell.exe -c "ssh user@host 'cat >filename'"
    

    (刚刚用 21MB 进行了测试.tgz

    请注意,您不能朝相反的方向操作(使用 PowerShell 调用wsl.exe),因为那里的管道会损坏带有 Windows 行尾的文件(也通过相同的测试确认了这一点;-)。

  • 另一种选择:我将 Windows OpenSSH 服务器安装在我的系统上以应对这种情况。然后我可以使用 Windows OpenSSH 作为 WSL2 的跳转主机。例如:

    scp -J windows_username@$(hostname).local filename.tgz remote_name@remote_host:/path/to/filename.tgz
    

    (最近没有测试过,根据记忆和文档)

    使用 jumphost,远程系统将视连接来自 Windows 主机的 IP,而不是 WSL2 IP。

    还应该可以rsync通过 jumphost 的 SSH 连接来使用。

    还请注意,这假设你当 VPN 处于活动状态时从 WSL2 连接到 Windows 主机。某些 VPN 系统将禁用本地连接。

相关内容