首页 > 解决方案 > 如何在 X++(或 C#)中使用 Renci.SshNet 从其他服务器安全地发送文件,你使用端口转发吗?

问题描述

我想在 C# 程序中使用 Renci.SshNet 将 csv 文件从 FileServer 服务器(FL)发送到目标服务器(DEST)。
该程序在应用程序服务器 (AP) 上启动。
允许FL和DEST与防火墙通信,但不允许AP和DEST服务器直接与防火墙通信。

你能给我一个简单的 X++ 或 C# 示例源吗?

最重要的是,FL 服务器和 DEST 服务器之间的通信是加密的。

我在下面添加了我的问题。

在此处输入图像描述

目前允许 AP 和 DEST 与防火墙连接。由于AP和FL在同一个网段,所以FL的文件夹可以直接引用为网络文件夹。以后防火墙会拒绝AP和DEST的连接,允许FL和DEST连接。而FL文件夹可以作为网络文件夹直接从AP引用的情况没有改变。

如果您能就如何稍微改写程序源代码以建立一个加密互联网连接范围的安全连接,我将不胜感激。

今天我将向您展示我们系统上的 X++ 程序源的简化版本。

公共静态无效传输文件(str文件名){

    Microsoft.Dynamics.IntegrationFramework.Adapter.FileSystem 文件系统;
    Renci.SshNet.SftpClient sftpClient;
    System.IO.FileStream 文件流;
    文件路径文件路径;
    FilePath 文件路径已处理;
    FTPHostName 主机名地址;
    FTPLoginUser loginUser;
    FTPLoginPwd loginPwd;

    int portSFTP = 22;
    hostNameAddress = "sftp.samplecompany.com"
    loginUser = "SFTPUSER"
    loginPwd = "密码"
    文件路径 = "\\FL\CSV 文件夹\"

    文件系统 = AifUtil::getClrObject(#FileSystemProgId);
    fileSystem = new Microsoft.Dynamics.IntegrationFramework.Adapter.FileSystem();
    全文件名 = 文件路径 + 文件名;
    sftpClient = new Renci.SshNet.SftpClient(hostNameAddress, portSFTP, loginUser, loginPwd);

    tts开始;

    sftpClient.Connect();
    fileStream = new System.IO.FileStream(fullFileName, System.IO.FileMode ::Open);
    sftpClient.UploadFile(fileStream, 文件名);
    文件流.Dispose();
    sftpClient.Dispose();

    tts提交;

}

标签: c#sftpx++transferssh-tunnel

解决方案


端口转发确实是一种选择。但它不允许您将文件从 FL 传输到 DEST。您必须将文件从 FL 下载到 APP。然后使用端口转发从APP上传到DEST,并通过FL转发。


如果您想要直接传输,您所能做的就是通过 SSH shell 会话从 APP 到 FL 运行命令行 SFTP 客户端,以从 FL 传输到 DEST。


推荐阅读