通过 SSIS 处理 SFTP 或 FTPS 文件的最佳方法 [关闭]

Posted

技术标签:

【中文标题】通过 SSIS 处理 SFTP 或 FTPS 文件的最佳方法 [关闭]【英文标题】:Best Method to SFTP or FTPS Files via SSIS [closed] 【发布时间】:2010-09-29 09:33:32 【问题描述】:

这个问题最初询问在 SSIS 中通过 SFTP 或 FTPS 上传文件的最佳方法是哪种。它现在只是列出了每种解决方案的优缺点。这些天我个人使用 CozyRoc 的 SFTP 库,但我曾经使用过以下每种解决方案。

SSIS 组件库

方法:在每个开发和生产服务器上安装来自CozyRoc、Codeplex、BizCrypto、PragmaticWorks 或其他供应商的 SSIS 组件库,并使用 SFTP 任务上传文件。

优点:易于使用。它的外观、气味和感觉都像是一个普通的 SSIS 任务。 SSIS 还将密码识别为敏感信息,并允许您使用所有常规选项来保护敏感信息,而不仅仅是以不安全的方式以明文形式存储它。适用于其他 SSIS 任务,例如 ForEach 循环容器。上传和下载失败时出错。当您不知道远程 FTP 站点上要下载的文件的名称,或者直到运行时才知道要上传的文件的名称时,此功能非常有用。

缺点:除了 Codeplex 解决方案之外,在生产环境中获得许可需要花钱。需要在每台开发和生产机器上安装库。如果它是 Codeplex 解决方案,那么您正在使用不受任何特定供应商支持的软件。这也使您依赖供应商在每个版本之间更新他们的库。例如,在 2008 RTM'd 之前,我在 2008 的 CTP 版本上开发了一个新服务器,而 CozyRoc 2005 库与它不兼容。最终他们发布了 2008 兼容版本,但我不得不暂时使用命令行解决方案来解决这个问题。

命令行 SFTP 程序

方法:安装一个免费的命令行 SFTP 应用程序,例如 Putty 和 WinSCP,并通过运行批处理文件或操作系统进程任务来执行它。列出了通过 WinSCP 执行此操作的说明here。

优点:免费、免费和免费。如果您使用的是 Putty,您可以确定它是安全的,因为许多 GUI FTP 客户端似乎都在使用 Putty。您肯定知道您使用的是 SSH2 而不是 SSH。

缺点:我尝试的两个命令行实用程序(Putty 和 Cygwin)需要将 SFTP 密码存储在不安全的位置。我还没有找到在上传文件时捕获失败或错误的好方法。这个过程看起来和闻起来都不像 SSIS。大多数代码都封装在文本文件中,而不是 SSIS 本身。如果您不知道要上传或下载的文件的确切名称,则很难使用。

第 3 方 C# 或 VB.NET 库

方法:安装 SFTP 或 FTPS 库并使用引用该库的脚本任务来上传文件。 (我从来没有尝试过,所以我会猜测利弊)

优点:可能很容易捕获错误。应该可以很好地使用变量,因此即使您不知道要上传或下载的文件的确切名称,它也可能很容易使用。

缺点:这是一个结合 .NET 库的脚本任务。如果您使用的是 SSIS,那么您可能更喜欢 SSIS 任务而不是 .NET 代码。脚本任务也很难排除故障,因为它们没有与常规 .NET 项目相同的调试工具和功能。创建对 3rd 方代码的依赖项,该依赖项可能在不同版本的 SQL Server 之间不起作用。公平地说,它可能比第 3 方 SSIS 任务库更可能在不同版本的 SQL Server 之间工作。另一个巨大的骗局——到目前为止,我还没有找到一个免费的 C# 或 VB.NET 库。所以如果有人知道,请告诉我!

【问题讨论】:

【参考方案1】:

以下问题可能有用:

What would be a recommended choice of SSIS component to perform SFTP or FTPS task?

Cozyroc:

通过将服务器设置为“仅允许 SSHv2”并进行测试,应该很容易测试 ssh 协议的可用性。您是否尝试过询问 Cozy 的销售部门?

命令行 sftp:

未知的文件名问题可以通过简单的脚本/通配符的使用来解决(至少在 Cygwin 下)。

第三方库:

为什么需要用于 FTPS 的第三方库? .NET 从 2.0 左右开始支持此协议。

http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.enablessl.aspx

【讨论】:

对于免费解决方案,FTPS 看起来不错,除非我必须使用 SFTP。由于我希望有一个架构来处理这两种情况,我可能会依赖命令行 sftp。对于付费解决方案,CozyRoc、SecureBlackBox 和 Rebex 看起来都不错。谢谢!【参考方案2】:

我只是想提供有关我们实际决定采取哪些措施来解决 SSIS 中的 SFTP 问题的最新信息。以下是所发生情况的细分:

    我最初尝试使用 Putty 和一些批处理文件来上传文件,但很难捕获错误。此外,我将 SFTP 凭据存储在明文文件中,因为它是 Putty 上传脚本的一部分。

    我们以每年几百美元的价格为我们的 SSIS 服务器购买了 CozyRoc 许可证,我对使用他们产品的结果非常满意。使用 CozyRoc 的产品,如果上传有任何问题,控制流任务会引发错误。由于我的团队中还有几位初级 SSIS 程序员,因此他们更容易理解如何设置控制流任务,而不是使用 Putty 脚本方法。最后,使用 SSIS 的本机加密对密码进行加密,以保护敏感数据。我的服务器上不再有任何以明文形式存储的密码。

我确实查看了此问题中推荐的其他一些 3rd 方库,但 CozyRoc 似乎是供应商中最便宜的,而且他们还有一些其他 SSIS 任务,我可以在我的 BI 团队中使用.谢谢,CozyRoc!

【讨论】:

【参考方案3】:

没有组件,您可以使用脚本任务。见this link

Imports System
Imports Microsoft.SqlServer.Dts.Runtime
Imports Ftp
Imports System.IO

Public Class ScriptMain

    Public Sub Main()

        Try

            Dim cm As ConnectionManager = Dts.Connections.Add("FTP")
            cm.Properties("ServerName").SetValue(cm, Dts.Variables("SFTPServerName").Value.ToString)
            cm.Properties("ServerUserName").SetValue(cm, Dts.Variables("SFTPLogin").Value.ToString)
            cm.Properties("ServerPassword").SetValue(cm, Dts.Variables("SFTPPassword").Value.ToString)
            cm.Properties("ServerPort").SetValue(cm, Dts.Variables("SFTPPortNumber").Value.ToString)
            cm.Properties("Timeout").SetValue(cm, "0")
            cm.Properties("ChunkSize").SetValue(cm, "0") '1000 kb
            cm.Properties("Retries").SetValue(cm, "0")
            Dts.Variables("Continue").Value = 0

            Dim ftp As FtpClientConnection = New FtpClientConnection(cm.AcquireConnection(Nothing))
            Dim FilesList() As String
            Dim FolderName() As String

            Dim Separator As String = ";"
' \\ServerName\Share1;\\ServerName\Share2 : Local copy
            Dim FolderLocalListSrc As String = Dts.Variables("FolderLocalListSrc").Value.ToString
            Dim FolderLocalListDst() As String = Split(FolderLocalListSrc, Separator)
            Dim Counter As Integer

            ftp.Connect()
            ftp.GetListing(FolderName, FilesList)

            If FilesList IsNot Nothing Then

                Dim FileName As String

                For Each FileName In FilesList

                    Dim FileToProcess(0) As String
                    Dim FileToMove(0) As String

                    For Counter = 0 To FolderLocalListDst.GetUpperBound(0)

                        FileToProcess(0) = FileName
                        FileToMove(0) = FolderLocalListDst(Counter) + FileName

                        If (File.Exists(FileToMove(0)) = False) Then

                            ' Téléchargement en local
                            ftp.ReceiveFiles(FileToProcess, FolderLocalListDst(Counter), True, True)

                        End If

                    Next

                    ' Upload du fichier dans les archives du FTP
                    ftp.SendFiles(FileToMove, "/Archives", True, False)

                    ' Suppression du fichier à la racine du FTP
                    ftp.DeleteFiles(FileToProcess)

                Next

            End If

            ftp.Close()

            Dts.TaskResult = Dts.Results.Success
        Catch ex As Exception
            Dts.TaskResult = Dts.Results.Failure
        End Try

    End Sub

End Class

【讨论】:

仅仅用 sftp 前缀命名你的变量并不能使它成为 sftp...

以上是关于通过 SSIS 处理 SFTP 或 FTPS 文件的最佳方法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SSIS 包将文件从一个文件夹移动到 SFTP (WinSCP) 中的另一个文件夹(SSIS 的 SFTP 任务)

SFTP 和FTPS的区别

SSIS 通过 WINscp 从SFTP下载文件

FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择

FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择

SFTP 和FTPS的区别