FTP/FTPS/SFTP 之间的区别 - 可配置连接到它们中的任何一个

Difference between FTP/FTPS/SFTP - Configurable connection to any of them

我有一个要求,比如需要创建一个 C# 应用程序,它会根据在 app.config 文件中输入的设置(使用 [=32] 将 excel 文件上传到 "FTP/SFTP" 服务器=]).

我对这些协议很陌生,有很多疑问。

  1. FTP和SFTP服务器有什么区别?
  2. 是否可以使用 SFTP 连接方法访问 FTP 服务器,反之亦然(引导使用 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);
  1. 将鼠标悬停在您问题下方的标签上即可轻松找到。 FTP 和 SFTP 是完全不同的协议。 FTPS 是 FTP 加密

  2. 如果您使用的是WebRequestMethods.Ftp.UploadFile;,它将不适用于 SFTP,可能适用于 FTPS,但必须有一些选项可以打开加密在.

  • FTP:旧文件传输协议 (RFC959)。防火墙有问题,因为它使用动态端口并且有关这些端口的信息在应用程序级别交换。
  • FTPS:旧的 FTP 协议,但添加了对 TLS 的支持。防火墙问题更大,因为它们无法再查看应用程序级别以找出使用了哪些端口。
  • SFTP:完全不同的东西,因为它使用SSH协议传输文件。防火墙没有问题。

如果您的代码能够处理 FTPS 它通常也能够处理 FTP,但是有很多代码只能处理 FTP 而不能处理 FTPS。由于 SFTP 是完全不同的协议代码处理 FTP/FTPS 通常无法执行 SFTP。而 SFTP 处理代码不会做 FTP/FTPS。也有例外,即 FileZilla 可以在单个应用程序中处理所有这些协议。

关于将 FTPS 与 FtpWebRequests 一起使用,请参阅 msdn. Using SFTP with FtpWebRequests is not possible but there are other libraries

SFTP and the FTP/FTPS是两个完全不同的协议。您不能使用 FTP 上传到 SFTP 服务器,反之亦然。 FTPS 在 TLS/SSL 会话中 FTP。大多数 FTP clients/libraries 也支持 FTPS。

.NET 框架仅原生支持 FTP(S)(通过 FtpWebRequest class). To use the FTPS, set the FtpWebRequest.EnableSsltrue

.NET 框架中没有对 SFTP 的本机支持。你必须使用 3rd party library for the SFTP.


有些库为所有这些协议提供统一的接口。

例如 WinSCP .NET assembly, it is (almost) only about setting the SessionOptions.ProtocolProtocol.FTPProtocol.SFTP

SFTP 协议:

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

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-xxxxxxxxxxx...=@example.com
  • FTP: ftp://user@mypassword@example.com
  • FTPS: ftpes://user@mypassword@example.com

你可以WinSCP (GUI) generate the URL (connection string) for you.


请注意,WinSCP .NET 程序集不是本机 .NET 库。它只是一个围绕控制台应用程序的薄 .NET 包装器 (WinSCP)。

可能存在支持具有统一接口的所有协议的本机 .NET 库。但是我不知道有没有免费的。

(我是WinSCP的作者)

对于显式 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"
            };

如果您在下载、上传或获取文件列表方面需要帮助,请与我联系