سؤال

تم طرح هذا السؤال في الأصل ما هي أفضل طريقة لتحميل الملفات عبر SFTP أو FTPS في SSIS.وهو الآن يسرد فقط إيجابيات وسلبيات كل حل.أنا شخصيًا أستخدم مكتبة SFTP الخاصة بـ CozyRoc هذه الأيام، ولكني استخدمت كلًا من الحلول التالية في وقت أو آخر.

مكتبة مكونات SSIS

طريقة:قم بتثبيت مكتبة مكونات SSIS من كوزي روك, كودبلكس, بيزكريبتو, أعمال براغماتية, أو أي بائع آخر على كل خادم تطوير وإنتاج واستخدم مهمة SFTP لتحميل الملفات.

الايجابيات:سهل الاستخدام.يبدو الأمر، ورائحته، وملمسه وكأنه مهمة عادية لمباحث أمن الدولة.يتعرف SSIS أيضًا على كلمة المرور كمعلومات حساسة ويتيح لك جميع الخيارات العادية لحماية المعلومات الحساسة بدلاً من مجرد تخزينها بنص واضح بطريقة غير آمنة.يعمل بشكل جيد مع مهام SSIS الأخرى مثل ForEach Loop Containers.تظهر الأخطاء عندما تفشل عمليات التحميل والتنزيل.يعمل بشكل جيد عندما لا تعرف أسماء الملفات الموجودة على موقع FTP البعيد لتنزيلها أو عندما لا تعرف اسم الملف المراد تحميله حتى وقت التشغيل.

سلبيات:وباستثناء حل Codeplex، فإن الترخيص في بيئة الإنتاج يكلف أموالاً.يتطلب تثبيت المكتبات على كل جهاز تطوير وإنتاج.إذا كان هذا هو حل Codeplex، فأنت تستخدم برنامجًا غير مدعوم من قبل أي بائع محدد.وهذا أيضًا يجعلك تعتمد على البائع لتحديث مكتباته بين كل إصدار.على سبيل المثال، قبل 2008 RTM'd، كنت أقوم بتطوير خادم جديد على إصدار CTP لعام 2008 وكانت مكتبة CozyRoc 2005 غير متوافقة معه.وفي نهاية المطاف، أطلقوا إصدارًا متوافقًا مع عام 2008، ولكن اضطررت إلى استخدام حل سطر الأوامر مؤقتًا للتغلب على هذه المشكلة.

برنامج سطر الأوامر SFTP

طريقة:قم بتثبيت تطبيق SFTP مجاني لسطر الأوامر مثل PuTTY وWinSCP وتنفيذه إما عن طريق تشغيل ملف دفعي أو مهمة عملية لنظام التشغيل.تم إدراج تعليمات القيام بذلك عبر WinSCP هنا.

الايجابيات:حر، حر، حر.يمكنك التأكد من أنه آمن إذا كنت تستخدم PuTTY حيث يبدو أن العديد من عملاء GUI FTP يستخدمون PuTTY تحت الأغطية.أنت تعرف بالتأكيد أنك تستخدم SSH2 وليس SSH.

سلبيات:تتطلب الأداتان المساعدتان لسطر الأوامر اللتان جربتهما (Putty وCygwin) تخزين كلمة مرور SFTP في موقع غير آمن.لم أجد طريقة جيدة لالتقاط حالات الفشل أو الأخطاء عند تحميل الملفات.العملية لا تبدو ورائحتها مثل مباحث أمن الدولة.يتم تغليف معظم التعليمات البرمجية في ملفات نصية بدلاً من SSIS نفسها.يصعب استخدامه إذا كنت لا تعرف الاسم الدقيق للملف الذي تقوم بتحميله أو تنزيله.

مكتبة C# أو VB.NET لجهة خارجية

طريقة:قم بتثبيت مكتبة SFTP أو FTPS واستخدم مهمة البرنامج النصي التي تشير إلى المكتبة لتحميل الملفات.(لم أجرّب هذا مطلقًا، لذا سأخمن الإيجابيات والسلبيات)

الايجابيات:ربما من السهل التقاط الأخطاء.يجب أن يعمل بشكل جيد مع المتغيرات، لذلك قد يكون من السهل استخدامه حتى عندما لا تعرف الاسم الدقيق للملف الذي تقوم بتحميله أو تنزيله.

سلبيات:إنها مهمة نصية مدمجة مع مكتبات .NET.إذا كنت تستخدم SSIS، فمن المحتمل أنك تشعر براحة أكبر مع مهام SSIS ثم تعليمات NET البرمجية.من الصعب أيضًا استكشاف أخطاء مهام البرنامج النصي وإصلاحها نظرًا لأنها لا تحتوي على نفس أدوات وميزات تصحيح الأخطاء مثل مشاريع .NET العادية.ينشئ تبعية على تعليمات برمجية تابعة لجهة خارجية والتي قد لا تعمل بين إصدارات مختلفة من SQL Server.لكي نكون منصفين، فمن المرجح أن تعمل بين إصدارات مختلفة من SQL Server أكثر من مكتبة مهام SSIS التابعة لجهة خارجية.خدعة كبيرة أخرى - لم أجد مكتبة C# أو VB.NET مجانية تقوم بذلك حتى الآن.لذا إذا كان أي شخص يعرف واحدًا، فيرجى إبلاغي بذلك!

هل كانت مفيدة؟

المحلول

ربما يكون السؤال التالي مفيدًا:

ما هو الاختيار الموصى به لمكون SSIS لتنفيذ مهمة SFTP أو FTPS؟

كوزيروك:

يجب أن يكون من السهل اختبار مدى توفر بروتوكول ssh عن طريق ضبط الخادم على "السماح بـ SSHv2 فقط" وإجراء الاختبار.هل حاولت سؤال قسم المبيعات في Cozy؟

سطر الأوامر sftp:

يمكن حل مشكلة اسم الملف غير المعروف عن طريق البرمجة النصية البسيطة/استخدام أحرف البدل (على الأقل ضمن Cygwin).

ليب الطرف الثالث:

لماذا تحتاج إلى lib لجهة خارجية لـ FTPS؟لقد دعم .NET هذا البروتوكول منذ الإصدار 2.0 أو نحو ذلك.

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

نصائح أخرى

أردت فقط تقديم تحديث حول ما قررنا فعله بالفعل لحل مشكلات SFTP في مباحث أمن الدولة.وفيما يلي تفصيل ما حدث:

  1. حاولت في البداية استخدام PuTTY وبعض الملفات الدفعية لتحميل الملفات، ولكن كان من الصعب اكتشاف الأخطاء.كما كنت أقوم بتخزين بيانات اعتماد SFTP الخاصة بنا في ملفات نصية واضحة نظرًا لأنها كانت جزءًا من البرامج النصية للتحميل المعجون.

  2. لقد اشترينا ترخيص CozyRoc لخادم SSIS الخاص بنا مقابل بضع مئات من الدولارات سنويًا وأنا راضٍ تمامًا عن نتائج استخدام منتجهم.مع منتج CozyRoc، تثير مهمة التحكم في التدفق أخطاء في حالة وجود أي مشاكل في التحميل.وبما أن لدي أيضًا العديد من مبرمجي SSIS المبتدئين في فريقي، فقد كان من الأسهل عليهم فهم كيفية إعداد مهمة تدفق التحكم بدلاً من استخدام طريقة البرامج النصية المعجونة.وأخيرًا، يتم تشفير كلمة المرور باستخدام التشفير الأصلي لـ SSIS لحماية البيانات الحساسة.لم يعد لدي أي كلمات مرور مخزنة بنص واضح على الخادم الخاص بي.

لقد قمت بمراجعة بعض مكتبات الطرف الثالث الأخرى التي تمت التوصية بها في هذا السؤال، ولكن يبدو أن CozyRoc كانت أرخص الموردين وكان لديهم أيضًا بعض مهام SSIS الأخرى التي تمكنت من استخدامها في فريق ذكاء الأعمال الخاص بي.شكرا، كوزي روك!

بدون مكون، يمكنك استخدام مهمة البرنامج النصي.يرى هذا الرابط

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top