我为我们的客户编写了一项服务,该服务使用 FTP 自动将文件传输到给定的目的地。由于历史原因,我使用 WinInet 来执行 FTP。一切正常,但现在客户想要添加一个只接受 SFTP 连接的目的地。
我真的不喜欢从头开始实现这个的想法,那么有没有办法在本地或通过 WinInet 与 SFTP 服务器进行通信?有没有我可以使用的系统库(我不担心 P/Invoke :))?我是否必须为此购买第三方组件 - 如果需要,您会建议哪些?
.NET 框架中的任何版本都不支持 SFTP。
您必须为 SFTP 使用第三方库。
您可以使用WinSCP .NET 程序集。甚至还有一个WinSCP NuGet 包。
一个简单的 SFTP 上传 C# 示例:
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = "example.com",
UserName = "user",
Password = "mypassword",
SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Upload files
session.PutFiles(@"d:\toupload\*", "/home/user/").Check();
}
还有很多其他的例子。
您可以让WinSCP GUI 为您生成 SFTP 代码模板,如上所示,包括 C#、VB.NET 和 PowerShell。
该程序集只是 WinSCP 脚本的包装,因此它不是完全原生的 .NET 代码。因此,它并不适合 .NET 框架中的所有用例。它主要适用于自动化任务,在某种程度上适用于开发 GUI 应用程序,而不是真正适用于 Web 应用程序。
对于完全原生的 .NET SFTP 库,请参阅SSH.NET,奇怪的是尚未在任何答案中提及。
(我是WinSCP的作者)
Windows 10 还带有命令行 OpenSSHsftp
客户端。也可以为旧版本的 Windows 下载它。
不幸的是,WinInet 或任何其他标准 Windows 库本身并不支持 SFTP。
我很幸运使用 /n Software 的IP*Works SSH for .NET与各种 SFTP 服务器通信。
我创建了一个使用 WinSCP 与 SFTP 服务器交互的演示。
此应用程序能够使用 WinSCP .NET 程序集上传、删除、重命名和获取 SFTP 服务器中的文件系统信息。
http://sourceforge.net/projects/sharpssh/可能是你最好的。不过,我最终为 WinSCP 编写了脚本,这更容易......
为清楚起见进行编辑,我现在推荐https://github.com/sshnet/SSH.NET之类的东西,因为 SharpSSH 是一个死项目
.NET 框架从 2.0 版开始通过 FtpWebRequest 支持 FTP。尚不支持 SFTP。
如果您需要 FTP 和 SFTP,则必须尝试第三方组件。Tamir Gal有一个开源的 SFTP 实现,经常被推荐。或者,您可以尝试其中一种商业 SFTP 组件,例如我们的Rebex SFTP。
以下代码取自Rebex SFTP 教程页面:
// create client, connect and log in
Sftp client = new Sftp();
client.Connect(hostname);
client.Login(username, password);
// upload the content of 'c:\data' directory and all subdirectories
// to the '/wwwroot' directory at the server
client.PutFiles(@"c:\data\*", "/wwwroot", SftpBatchTransferOptions.Recursive);
client.Disconnect();
如果您不确定是否需要 FTPS 或 SFTP,您可以查看包含两者的Rebex 文件传输包。FTP API 与 SFTP API 几乎相同。
JFYI:.NET 中 SFTP 功能最丰富的组件可能是我们的SFTPBlackbox。