14

我为我们的客户编写了一项服务,该服务使用 FTP 自动将文件传输到给定的目的地。由于历史原因,我使用 WinInet 来执行 FTP。一切正常,但现在客户想要添加一个只接受 SFTP 连接的目的地。

我真的不喜欢从头开始实现这个的想法,那么有没有办法在本地或通过 WinInet 与 SFTP 服务器进行通信?有没有我可以使用的系统库(我不担心 P/Invoke :))?我是否必须为此购买第三方组件 - 如果需要,您会建议哪些?

4

7 回答 7

24

.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 下载它。

于 2017-08-13T09:01:34.783 回答
1

不幸的是,WinInet 或任何其他标准 Windows 库本身并不支持 SFTP。

我很幸运使用 /n Software 的IP*Works SSH for .NET与各种 SFTP 服务器通信。

于 2009-12-10T13:56:59.273 回答
1

我创建了一个使用 WinSCP 与 SFTP 服务器交互的演示。

此应用程序能够使用 WinSCP .NET 程序集上传、删除、重命名和获取 SFTP 服务器中的文件系统信息。

看看: https ://github.com/ducfilan/SFTP-with-WinSCP

于 2017-09-20T02:07:43.277 回答
0

http://sourceforge.net/projects/sharpssh/可能是你最好的。不过,我最终为 WinSCP 编写了脚本,这更容易......

为清楚起见进行编辑,我现在推荐https://github.com/sshnet/SSH.NET之类的东西,因为 SharpSSH 是一个死项目

于 2009-12-10T13:56:46.043 回答
0

.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 几乎相同。

于 2009-12-17T00:07:21.230 回答
0

JFYI:.NET 中 SFTP 功能最丰富的组件可能是我们的SFTPBlackbox

于 2011-03-08T13:02:01.827 回答
-2

我使用 edtFTPnet/PRO

http://www.enterprisedt.com/products/edtftpnetpro/overview.html

效果很好

于 2009-12-10T15:22:38.663 回答