C# “如何执行”;“双跳”;通过.NET中的SFTP/SSH?

C# “如何执行”;“双跳”;通过.NET中的SFTP/SSH?,c#,.net,ssh,sftp,winscp,C#,.net,Ssh,Sftp,Winscp,在我的场景中,我尝试从localappserver->Middle Server(DMZ)->客户机服务器 我需要将文件从本地应用程序服务器移动到客户端服务器并返回 那么我的问题是,最广泛使用的标准是什么? 我目前使用通过SFTP连接到中间服务器,然后调用中间服务器上的命令下载文件并上传到客户端服务器。我并不是一个真正的粉丝,因为我觉得它很容易出错,因为我手动输入命令,而不是使用WinSCP的库来上传和下载。当我试图用命令列出客户机服务器上的所有文件时,由于函数返回void 我看了一下哪个应用似

在我的场景中,我尝试从
localappserver->Middle Server(DMZ)->客户机服务器

我需要将文件从
本地应用程序服务器
移动到
客户端服务器
并返回

那么我的问题是,最广泛使用的标准是什么?

我目前使用通过SFTP连接到
中间服务器
,然后调用
中间服务器上的命令下载文件并上传到
客户端服务器
。我并不是一个真正的粉丝,因为我觉得它很容易出错,因为我手动输入命令,而不是使用WinSCP的库来上传和下载。当我试图用命令列出
客户机服务器上的所有文件时,由于函数返回
void

我看了一下哪个应用似乎更广泛,但是我也看不到有任何真正的方法可以使用该库执行“双跳”。

使用,很简单:

SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = "example.com",
    UserName = "username",
    Password = "password",
    SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...=",
};

sessionOptions.AddRawSettings("Tunnel", "1");
sessionOptions.AddRawSettings("TunnelHostName", "tunnel.example.com");
sessionOptions.AddRawSettings("TunnelUserName", "username");
sessionOptions.AddRawSettings("TunnelPasswordPlain", "password");
sessionOptions.AddRawSettings("TunnelHostKey", "ssh-rsa 2048 xxxxxxxxxxx...=");

using (Session session = new Session())
{
    session.Open(sessionOptions);

    // Your code
}
WinSCP GUI可以像上面一样为您提供(除了
隧道hostkey


使用SSH.NET,您可以通过以下方式显式实现端口转发:

  • 打开与“中间服务器”的连接
  • 创建转发端口
  • 正在打开到转发端口的第二个连接
有关一些示例,请参见



另一个黑客解决方案是在“中间服务器”上执行
ssh
,以促进第二次“跳跃”。

感谢您的帮助,因此我的理解是,我创建了一个会话实例,用于从本地服务器连接到中间服务器。然后,我使用上面的示例创建一个从中间服务器到客户机的会话实例?正确吗?我假设您指的是
Renci.SshNet.Session
(不是
WinSCP.Session
)。您对第二步的描述有点不清楚,因为没有“上面的示例”。对不起,我指的是
Session
时的
WinSCP.Session
。所以当从本地服务器连接到客户端服务器时,我只创建一个
会话
?抱歉,如果我的问题有点傻,我对SFTP/SSHYes的整个概念是陌生的,
WinSCP.Session
支持SSH隧道,所以上面的代码就是您所需要的->只需要一个
Session
实例。我想我现在明白了。所以要将文件从客户端服务器下载到中间服务器。我仍然需要执行类似于session.InvokeCommand(someCommand)
的操作?或者我可以通过指定包括服务器名称在内的整个路径来使用实际函数,如
session.GetFiles()
。再次感谢你的耐心