Разница между FTP/FTPS/SFTP - настраиваемое соединение с любым из них

У меня есть требование, например, необходимость создать приложение C#, которое будет загружать файл Excel на сервер "FTP/SFTP" на основе настроек, введенных в app.config файл (используя "ftp\ftps\sftp").

Я новичок в этих протоколах, у меня так много сомнений.

  1. В чем разница между FTP и SFTP сервером?
  2. Можно ли получить доступ к FTP-серверу, используя методы подключения SFTP и наоборот (руководствуясь использованием библиотеки Rebex для подключения к SFTP)?
  3. Как изменить следующий метод загрузки FTP на FTPS

Код ниже:

string PureFileName = new FileInfo(fileName).Name;
string uploadUrl = String.Format("ftp://{0}/{1}", ftpurl, PureFileName);
FtpWebRequest req = (FtpWebRequest)FtpWebRequest.Create(uploadUrl);
req.Proxy = null;
req.Method = WebRequestMethods.Ftp.UploadFile;
req.Credentials = new NetworkCredential(user, pass);
req.UseBinary = true;
req.UsePassive = true;
byte[] data = File.ReadAllBytes(fileName);
req.ContentLength = data.Length;
Stream stream = req.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
FtpWebResponse res = (FtpWebResponse)req.GetResponse(); 

Это как смена url с FTP на FTPS?

string uploadUrl = String.Format("ftps://{0}/{1}", ftpurl, PureFileName);

4 ответа

Решение
  • FTP: старый протокол передачи файлов (RFC959). Проблема с брандмауэрами, так как они используют динамические порты и информация об этих портах обменивается на уровне приложений.
  • FTPS: старый протокол FTP, но добавлена ​​поддержка TLS. Еще более проблематично с брандмауэрами, поскольку они больше не могут просматривать уровень приложений, чтобы выяснить, какие порты используются.
  • SFTP: что-то совершенно другое, потому что он использует протокол SSH для передачи файлов. Нет проблем с брандмауэрами.

Если ваш код способен обрабатывать FTPS, он, как правило, тоже может обрабатывать FTP, но есть много кода, который может обрабатывать только FTP, а не FTPS. Поскольку SFTP - это совершенно другой протокол, обработка FTP / FTPS обычно не сможет выполнять SFTP. И код обработки SFTP не будет делать FTP / FTPS. Есть исключения, то есть FileZilla может обрабатывать все эти протоколы в одном приложении.

Что касается использования FTPS с FtpWebRequests, см. Msdn. Использование SFTP с FtpWebRequests невозможно, но есть и другие библиотеки.

SFTP и FTP / FTPS - это два совершенно разных протокола. Вы не можете использовать FTP для загрузки на сервер SFTP и наоборот. FTPS - это FTP через сеанс TLS/SSL. Большинство FTP-клиентов / библиотек также поддерживают FTPS.

Платформа.NET изначально поддерживает только FTP (S) (через FtpWebRequest класс). Чтобы использовать FTPS, используйте ftps:// URL или установить FtpWebRequest.EnableSsl в true,

В платформе.NET отсутствует встроенная поддержка SFTP. Вы должны использовать стороннюю библиотеку для SFTP.


Есть библиотеки, которые предлагают единый интерфейс для всех этих протоколов.

Например, для сборки WinSCP .NET речь идет (почти) только о настройке SessionOptions.Protocol к Protocol.FTP или Protocol.SFTP,

Протокол SFTP:

SessionOptions sessionOptions = new SessionOptions {
    Protocol = Protocol.Sftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
    SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
};

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

Протокол FTP:

SessionOptions sessionOptions = new SessionOptions {
    Protocol = Protocol.Ftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
};

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

Протокол FTPS:

SessionOptions sessionOptions = new SessionOptions {
    Protocol = Protocol.Ftp,
    FtpSecure = FtpSecure.Explicit,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
};

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

Если вам нужно настроить сеанс, вы можете упростить его, используя SessionOptions.ParseUrl это позволяет вам настраивать основные параметры сеанса, используя одну строку соединения (URL), которую вы указали в файле конфигурации.

SessionOptions sessionOptions = new SessionOptions();
sessionOptions.ParseUrl(connectionString);

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

Строка подключения может быть такой:

  • SFTP: sftp://user@mypassword;fingerprint=ssh-rsa-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx@example.com
  • FTP: ftp://user@mypassword@example.com
  • FTPS: ftpes://user@mypassword@example.com

Вы можете иметь WinSCP (GUI) для генерации URL (строка подключения) для вас.


Обратите внимание, что сборка WinSCP .NET не является нативной библиотекой.NET. Это просто тонкая оболочка.NET вокруг консольного приложения ( WinSCP).

Могут быть собственные библиотеки.NET, которые поддерживают все протоколы с единым интерфейсом. Но я не знаю ни одного бесплатного.

(Я автор WinSCP)

  1. Найти можно довольно легко, наведя метки под ваш вопрос. FTP и SFTP - это совершенно разные протоколы. FTPS - это FTP с шифрованием

  2. нет

  3. Если вы используете WebRequestMethods.Ftp.UploadFile; он не будет работать для SFTP, может быть, для FTPS, но должна быть возможность включить шифрование.

Для FTPS Явный

  // Setup session options
            SessionOptions sessionOptions = new SessionOptions
            {
                Protocol = Protocol.Ftp,
                HostName = "address.co.za",
                FtpSecure = FtpSecure.Explicit,
                UserName = "username",
                Password = "pass",
                TlsHostCertificateFingerprint = "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
            };

Если вам нужна помощь с загрузкой, загрузка списка файлов, свяжитесь со мной.

Другие вопросы по тегам