You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SSH.NET实现Linux VPS SSH后SFTP跨服务器文件上传方案咨询

Hey,这个需求完全可以高效实现,根本不用绕本地那道弯!下面给你拆解几个靠谱的方案,包括你提到的SSH.NET的用法:

核心结论

完全不需要先下载文件到本地再上传——我们可以直接让数据在两台服务器之间流转,或者通过桌面应用做内存级的中转,避免本地存储的低效操作。


方案1:用SSH.NET做「流中转」传输(数据不落地本地)

SSH.NET支持直接操作远程文件流,你可以在桌面应用中同时建立到源VPS和目标服务器的SFTP连接,然后把源文件的流直接“管道”到目标服务器的上传流里,全程数据只在内存中临时流转,不写入本地硬盘。

举个简单的C#示例:

using SSH.NET;

// 连接源VPS的SFTP服务
using var sourceSftp = new SftpClient("source-vps-ip", "source-username", "source-password");
sourceSftp.Connect();

// 连接目标服务器的SFTP服务
using var targetSftp = new SftpClient("target-server-ip", "target-username", "target-password");
targetSftp.Connect();

// 打开源VPS上的文件流,直接上传到目标服务器
using var sourceFileStream = sourceSftp.OpenRead("/path/to/source/file");
targetSftp.UploadFile(sourceFileStream, "/path/to/target/file");

// 断开连接
sourceSftp.Disconnect();
targetSftp.Disconnect();

如果是超大文件,可以配合分块读取的方式,避免内存占用过高。


方案2:让源VPS直接向目标服务器传输(效率最高)

如果源VPS能直接访问目标服务器的SSH/SFTP服务,这是最优解——桌面应用只需要给源VPS发一条命令,剩下的传输工作完全在两台服务器之间完成,根本不占用本地带宽。

具体操作:

  1. 先在源VPS上配置好目标服务器的SSH免密登录(提前把源VPS的公钥加到目标服务器的~/.ssh/authorized_keys里);
  2. 用SSH.NET在桌面应用中执行源VPS上的scp或sftp命令:
using SSH.NET;

using var sshClient = new SshClient("source-vps-ip", "source-username", "source-password");
sshClient.Connect();

// 执行scp命令直接传输文件
var transferCommand = sshClient.CreateCommand(
    "scp /path/to/source/file target-username@target-server-ip:/path/to/target/directory/"
);
var commandResult = transferCommand.Execute();

// 可以通过commandResult的输出判断传输是否成功
Console.WriteLine(commandResult);

sshClient.Disconnect();

方案3:端口转发(适合目标服务器无法被源VPS直接访问的场景)

如果目标服务器处于内网,只有你的桌面应用能访问,那可以用SSH.NET做本地端口转发:把目标服务器的SFTP端口(默认22)映射到源VPS的某个端口上,让源VPS可以通过这个映射端口访问目标服务器,然后再用方案2的scp命令传输。

示例代码(在桌面应用中配置转发):

using SSH.NET;

// 连接源VPS的SSH服务
using var sshClient = new SshClient("source-vps-ip", "source-username", "source-password");
sshClient.Connect();

// 配置端口转发:将源VPS的10022端口转发到目标服务器的22端口
var portForward = new ForwardedPortLocal("127.0.0.1", 10022, "target-server-ip", 22);
sshClient.AddForwardedPort(portForward);
portForward.Start();

// 现在源VPS可以通过localhost:10022访问目标服务器的SFTP,执行scp命令即可
var transferCommand = sshClient.CreateCommand(
    "scp /path/to/source/file target-username@localhost:10022:/path/to/target/directory/"
);
transferCommand.Execute();

// 清理资源
portForward.Stop();
sshClient.Disconnect();

注意事项

  • 优先使用SSH密钥认证代替密码登录,既安全又能避免命令执行时需要手动输入密码的问题;
  • 大文件传输时,流中转方案建议分块读取写入,防止内存溢出;
  • 如果传输的是大量小文件,建议先在源VPS上打包成压缩包再传输,能大幅提升效率。

内容的提问来源于stack exchange,提问作者mbuchok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:56:00