我需要使用C#/.NET 3.5连接到SFTP服务器来下载和上传文件。
.NET 3.5框架是否提供任何内置工具/机制/库来连接到SFTP服务器以下载和上传文件?
有商业解决方案:
……以及免费的:
我个人没有任何使用它们的经验。
Sanj的答案展示了如何通过驱动其控制台应用程序来使用WinSCP。虽然这是可能的,但实际上有WinSCP .NET程序集可以为开发人员提供本地的.NET接口来进行WinSCP脚本编写。
甚至还有一个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();
}
同样适用于VB.NET:
' Setup session options
Dim sessionOptions As New SessionOptions
With sessionOptions
.Protocol = Protocol.Sftp
.HostName = "example.com"
.UserName = "user"
.Password = "mypassword"
.SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="
End With
Using session As New Session
' Connect
session.Open(sessionOptions)
' Upload files
session.PutFiles("d:\toupload\*", "/home/user/").Check()
End Using
两种语言中有很多其他示例(还有更多)。
我更喜欢WinSCP。它是免费的,我之前试过,完美运行。如果你下载COM文件,你可以做如下操作: 注意:我将参数从ini传递。
const string logname = "log.xml";
string username = ini.IniReadValue("sftp", "Username");
string password = ini.IniReadValue("sftp", "Password");
string remotehost = ini.IniReadValue("sftp", "Remote Host");
string dloadpath = ini.IniReadValue("Download", "Local Path");
Process winscp = new Process();
winscp.StartInfo.FileName = @ini.IniReadValue("winscp", "compath");
winscp.StartInfo.Arguments = "/log=" + logname;
winscp.StartInfo.UseShellExecute = false;
winscp.StartInfo.RedirectStandardInput = true;
winscp.StartInfo.RedirectStandardOutput = true;
winscp.StartInfo.CreateNoWindow = true;
try
{
winscp.Start();
lblconfirm.Text = "Status: WinSCP Started Successfully";
}
catch (Exception ex)
{
writeLog("from PutSFTP: Could not run the WinSCP executable " + winscp.StartInfo.FileName + Environment.NewLine + ex.Message);
}
winscp.StandardInput.WriteLine("option batch abort");
winscp.StandardInput.WriteLine("option confirm off");
winscp.StandardInput.WriteLine("open sftp://" + username + ":" + password + "@" + remotehost);
winscp.StandardInput.WriteLine("cd " + ini.IniReadValue("Download", "Remote Path"));
winscp.StandardInput.WriteLine(@"get " + "/" + ini.IniReadValue("Download", "Remote Path") + "/*" + ini.IniReadValue("Download", "FileType") + " " + ini.IniReadValue("Download", "Local Path"));
winscp.StandardInput.Close();
string output = winscp.StandardOutput.ReadToEnd();
lblconfirm.Text = "Download Success! Check logs for moe info";
winscp.WaitForExit();
不,.NET没有附带任何SFTP库。但是,WinSCP是一个免费的实用程序,您可以下载使用。我以前曾经使用它从PayPal报告服务器下载信息。
它有一个很好的命令行设置,可以让您自动下载/上传文件。因此,从我的.NET应用程序中,您只需使用特定参数调用该进程并等待其完成即可。
IIS 7.x(附带于Windows Server 2008或Windows 7)仅支持 FTPs,不支持本地的sFTP协议(关于解释请查看下面的更新)。但是,有一些服务器解决方案像这个可以用于sFTP协议。
如果你需要一个sFTP客户端,目前微软还没有提供任何支持。但我使用过一个第三方的.NET组件wodSFTP.NET,它是一个sFTP客户端,非常好用。
在这里,你可以找到产品和文档:wodSFTP.NET。你可以免费下载示例和在线文档,无需注册。
请注意,您可以选择购买不带或带C#源代码的版本。它们还有SSH组件。无论您选择哪个版本,C#和VB.NET的示例始终可用。var wodSFTP1 = new WeOnlyDo.Client.SFTP();
// Authenticate with server using hostname, login, password.
wodSFTP1.Hostname = "your_hostname";
wodSFTP1.Login = "your_login";
wodSFTP1.Password = "your_password";
wodSFTP1.Blocking = True; // Use synchronous connections
wodSFTP1.Connect();
wodSFTP1.GetFile("c:\", "/home/somepath/somefile.txt");
这个例子使用阻塞(同步)模式。请注意,您也可以异步地使用组件 - 在这种情况下,事件将被触发,您可以编写事件处理程序来对其做出反应。
请注意,此示例不使用密钥进行身份验证,但当然也支持此功能(您可以使用基于密钥的身份验证、基于密码的身份验证或两者都使用)。
该框架不支持SFTP协议。
由于没有本地支持,您可以在Google中搜索其他商业组件,只需键入类似“SFTP组件.NET”的内容。