如何与SFTP服务器通信

时间:2009-12-10 13:53:50

标签: c# .net sftp

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

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

7 个答案:

答案 0 :(得分:15)

在任何版本的.NET框架中都不支持SFTP。

您必须使用第三方库进行SFTP。

您可以使用WinSCP .NET assembly。甚至还有WinSCP NuGet package

一个简单的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();
}

lot of other examples

您可以拥有WinSCP GUI generate an SFTP code template,如上所述,包括C#,VB.NET和PowerShell。

enter image description here

程序集只是WinSCP脚本的包装器,因此它不是完全原生的.NET代码。因此,它不适合.NET框架中的所有用例。它主要适用于自动化任务,有些用于开发GUI应用程序,而不适用于Web应用程序。

对于完全原生的.NET SFTP库,请参阅SSH.NET,这在任何答案中都没有提及。

(我是WinSCP的作者)

答案 1 :(得分:1)

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

我和/ n Software的IP*Works SSH for .NET在与各种各样的SFTP服务器交谈时运气不错。

答案 2 :(得分:1)

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

此应用程序可以使用WinSCP .NET程序集在SFTP服务器中上载,删除,重命名和获取文件系统信息。

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

答案 3 :(得分:0)

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

编辑为了清晰起见,我建议像https://github.com/sshnet/SSH.NET这样的东西,因为SharpSSH是一个死的项目

答案 4 :(得分:0)

.NET Framwork从版本2.0开始通过FtpWebRequest支持FTP。尚未支持SFTP。

如果您需要FTP和SFTP,则必须尝试使用​​第三方组件。来自Tamir Gal的open source implementation of SFTP经常被推荐。或者您可以尝试使用商业SFTP组件之一,例如Rebex SFTP

以下代码取自Rebex SFTP tutorial page

// 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 File Transfer Pack。 FTP API与SFTP几乎完全相同。

答案 5 :(得分:0)

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

答案 6 :(得分:-2)