使用.NET 3.5进行SFTP

3

我需要使用C#/.NET 3.5连接到SFTP服务器来下载和上传文件。

.NET 3.5框架是否提供任何内置工具/机制/库来连接到SFTP服务器以下载和上传文件?


有商业解决方案:
  • http://www.rebex.net/sftp.net/
  • http://www.enterprisedt.com/products/edtftpnetpro/overview.html 我个人对它们没有任何经验。
- undefined
7个回答

4

1
添加可点击的链接:http://www.rebex.net/sftp.net/ 和 http://www.tamirgal.com/blog/page/SharpSSH.aspx - Martin Vobr
1
如果你在谈论商业库,那么你一定要加入SecureBlackbox库:https://www.eldos.com/sbb/desc-sftp.php - Nickolay Olshevsky
对于仍在查看此答案并愿意使用商业解决方案的任何人,也应该尝试 http://www.componentpro.com/sftp.net/ 库,它具有许多高级功能。我对它的使用体验非常好。 - Mubin
SharpSSH是一个已经停止维护的项目,请避免使用它。 - Martin Prikryl

3
.NET框架中没有任何版本支持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 GUI生成SFTP代码模板,包括C#、VB.NET和PowerShell等语言。

enter image description here


如上所述,装配件只是WinSCP脚本的包装器,因此它不是完全本地的.NET代码。由于这样,它并不适用于.NET框架中的所有用例。它主要适用于自动化任务,而不是开发GUI或Web应用程序。
对于一个完全本地的.NET SFTP库,请参见SSH.NET,这在任何答案中都没有奇怪地提到。
(我是WinSCP的作者)

1

我更喜欢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();

有一个WinSCP .NET程序集,它作为WinSCP的包装器,因此您不需要大部分代码。请参见我的答案 - Martin Prikryl

1

不,.NET没有附带任何SFTP库。但是,WinSCP是一个免费的实用程序,您可以下载使用。我以前曾经使用它从PayPal报告服务器下载信息。

它有一个很好的命令行设置,可以让您自动下载/上传文件。因此,从我的.NET应用程序中,您只需使用特定参数调用该进程并等待其完成即可。


1
WinSCP确实是一个不错且有用的工具,我可以推荐它!我已经使用了命令行界面进行批处理脚本。 - Matt
有一个WinSCP .NET程序集,它作为WinSCP的包装器,因此您可以获得本地的.NET接口-请参见我的答案 - Martin Prikryl

0

IIS 7.x(附带于Windows Server 2008或Windows 7)仅支持 FTPs,不支持本地的sFTP协议(关于解释请查看下面的更新)。但是,有一些服务器解决方案像这个可以用于sFTP协议。

如果你需要一个sFTP客户端,目前微软还没有提供任何支持。但我使用过一个第三方的.NET组件wodSFTP.NET,它是一个sFTP客户端,非常好用。

在这里,你可以找到产品和文档:wodSFTP.NET。你可以免费下载示例和在线文档,无需注册。

请注意,您可以选择购买不带或带C#源代码的版本。它们还有SSH组件。无论您选择哪个版本,C#和VB.NET的示例始终可用。
例如(来自网站www.weonlydo.com,转换为C#):
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");

这个例子使用阻塞(同步)模式。请注意,您也可以异步地使用组件 - 在这种情况下,事件将被触发,您可以编写事件处理程序来对其做出反应。

请注意,此示例不使用密钥进行身份验证,但当然也支持此功能(您可以使用基于密钥的身份验证、基于密码的身份验证或两者都使用)。


更新:FTPssFTP是不同的协议。请点击链接了解详细解释。


你能在IIS 7.x中添加SFTP服务器的信息链接吗?据我所知,IIS 7只配备FTPS(FTP/SSL),而不是SFTP。它们并不相同。请参见https://www.rebex.net/kb/secure-ftp/default.aspx。 - Martin Vobr
@Martin:你是对的,谢谢你的提示。我已经更新了我的答案。 - Matt

0

该框架不支持SFTP协议。


-1

由于没有本地支持,您可以在Google中搜索其他商业组件,只需键入类似“SFTP组件.NET”的内容。


我同意目前还没有SFTP本地支持。我们公司使用ultimate sftp - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接