FTP/FTPS/SFTP 之间的区别 - 可配置连接到它们中的任何一个
Difference between FTP/FTPS/SFTP - Configurable connection to any of them
我有一个要求,比如需要创建一个 C# 应用程序,它会根据在 app.config
文件中输入的设置(使用 [=32] 将 excel 文件上传到 "FTP/SFTP" 服务器=]).
我对这些协议很陌生,有很多疑问。
- FTP和SFTP服务器有什么区别?
- 是否可以使用 SFTP 连接方法访问 FTP 服务器,反之亦然(引导使用 Rebex 库连接到 SFTP)?
- 如何将以下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);
将鼠标悬停在您问题下方的标签上即可轻松找到。 FTP 和 SFTP 是完全不同的协议。 FTPS 是 FTP 加密
否
如果您使用的是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.EnableSsl
到 true
。
.NET 框架中没有对 SFTP 的本机支持。你必须使用 3rd party library for the SFTP.
有些库为所有这些协议提供统一的接口。
例如 WinSCP .NET assembly, it is (almost) only about setting the 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 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"
};
如果您在下载、上传或获取文件列表方面需要帮助,请与我联系
我有一个要求,比如需要创建一个 C# 应用程序,它会根据在 app.config
文件中输入的设置(使用 [=32] 将 excel 文件上传到 "FTP/SFTP" 服务器=]).
我对这些协议很陌生,有很多疑问。
- FTP和SFTP服务器有什么区别?
- 是否可以使用 SFTP 连接方法访问 FTP 服务器,反之亦然(引导使用 Rebex 库连接到 SFTP)?
- 如何将以下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);
将鼠标悬停在您问题下方的标签上即可轻松找到。 FTP 和 SFTP 是完全不同的协议。 FTPS 是 FTP 加密
否
如果您使用的是
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.EnableSsl
到 true
。
.NET 框架中没有对 SFTP 的本机支持。你必须使用 3rd party library for the SFTP.
有些库为所有这些协议提供统一的接口。
例如 WinSCP .NET assembly, it is (almost) only about setting the 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 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"
};
如果您在下载、上传或获取文件列表方面需要帮助,请与我联系