【问题标题】:How to perform "double hop" via SFTP/SSH in .NET?如何在 .NET 中通过 SFTP/SSH 执行“双跳”?
【发布时间】:2018-01-17 10:09:35
【问题描述】:

在我的场景中,我试图从 Local App Server -> Middle Server (DMZ) -> Client Server 出发

我需要将文件从 Local App Server 移动到 Client Server 并返回。

所以我的问题是最广泛使用的标准是什么?

我目前正在使用WinSCP通过SFTP连接到Middle Server,然后在Middle Server上调用命令来下载和上传文件到Client Server。我不是这个的粉丝,因为我觉得它很容易出错,因为我手动输入命令,而不是使用 WinSCP 的库来上传和下载。当我尝试使用命令列出Client Server 上的所有文件时,它也会让我陷入困境,因为函数返回void

我查看了SSH.NET,它似乎被更广泛地使用,但是我也看不到使用该库执行“双跳”的任何真正方法。

【问题讨论】:

    标签: c# .net ssh sftp winscp


    【解决方案1】:

    使用WinSCP .NET assembly,很容易:

    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 可以为您提供generate a code template to connect through tunnel,就像上面那个一样(TunnelHostKey 除外)。


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

    • 打开与“中间服务器”的连接;
    • 创建转发端口;
    • 打开到转发端口的第二个连接。

    有关示例,请参阅Connection to MySQL from .NET using SSH.NET Library


    另一个骇人听闻的解决方案是在“中间服务器”上执行ssh 以促进第二个“跃点”。

    【讨论】:

    • 感谢您的帮助,所以我的理解是我创建了一个 Session 实例来从本地连接到中间服务器。然后我使用上面的示例创建从中间服务器到客户端的 Session 实例?对吗
    • 我假设您指的是Renci.SshNet.Session(不是WinSCP.Session)。您对第二步的描述有点不清楚,因为没有 "example above"
    • 对不起,我指的是WinSCP.Session,指的是Session。所以我从本地服务器连接到客户端服务器时只创建一个Session?如果我的问题有点愚蠢,我很抱歉,我对 SFTP/SSH 的整个想法很陌生
    • 是的,WinSCP.Session 原生支持 SSH 隧道,所以上面的代码就是你所需要的 -> 只需要一个 Session 实例。
    • 我想我现在明白了。所以要将文件从客户端服务器下载到中间服务器。我仍然需要做类似session.InvokeCommand(someCommand) 的事情吗?或者我可以通过指定包括服务器名称的整个路径来使用session.GetFiles() 等实际功能。再次感谢您的耐心等待
    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2019-12-06
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多