我为我们的客户编写了一项服务,使用FTP自动将文件传输到指定目的地。由于历史原因,我正在使用WinInet执行FTPing。一切正常,但现在客户想要添加一个只接受SFTP连接的目的地。
我真的不喜欢从头开始实现这一点的想法,那么有没有办法本地或通过WinInet与SFTP服务器进行通信?有没有我可以使用的系统库(我不担心P / Invoke :))?我是否必须为此购买第三方组件 - 如果是,您会建议哪些组件?
答案 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();
}
您可以拥有WinSCP GUI generate an SFTP code template,如上所述,包括C#,VB.NET和PowerShell。
程序集只是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服务器中上载,删除,重命名和获取文件系统信息。
答案 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)