错误"错误消息"访问Windows OpenSSH SFTP服务器上的文件时

时间:2016-09-08 15:49:05

标签: .net windows sftp openssh ssh.net

我需要通过SFTP从网站传输大文件。我无法将这些文件(甚至是临时文件)存储在Web服务器上,因此我将文件以块的形式传输到SFTP服务器。

我已经在另一台Windows计算机上安装了OpenSSH(version 5_30_2016)并尝试使用SSH.NET(版本2016.0.0)连接到它。

此示例代码会导致在我的计算机上抛出异常:

const string PATH = "/D:/sftp/test.xml";
var Client = new SftpClient("host", 22, "username", "password");

Client.Connect();   

if(!Client.Exists(PATH))
{                       
    var s = Client.Create(PATH, 1024 * 4);
    s.Dispose();        
}   

var Data = File.ReadAllBytes(@"D:\Temp\TestFile.xml");  
using(var w = Client.Open(PATH, FileMode.Append, FileAccess.ReadWrite)) // this line throws an exception
{
    w.Write(Data, 0, Data.Length);
}

Client.Disconnect();

每当我尝试连接我的客户端以追加或打开时,我都会收到SSH异常 - 基本上是任何返回StreamStreamWriter的操作。

我通过SFTP客户端返回的错误是"错误消息" ,这不是非常具有描述性的。我只是希望我在方法中错过了一些明显的东西......!

我也尝试过使用其他SFTP库,但他们似乎都依赖于将物理本地文件传递到远程位置,这不是我想要做的。 SSH.NET似乎最适合我的需求,因为它提供了将字节数组和流传递给SFTP服务器的方法

堆栈跟踪,消息"错误消息"

   at Renci.SshNet.Sftp.SftpSession.RequestOpen(String path, Flags flags, Boolean nullOnError)
   at Renci.SshNet.Sftp.SftpFileStream..ctor(ISftpSession session, String path, FileMode mode, FileAccess access, Int32 bufferSize, Boolean useAsync)
   at Renci.SshNet.Sftp.SftpFileStream..ctor(ISftpSession session, String path, FileMode mode, FileAccess access, Int32 bufferSize)
   at Renci.SshNet.SftpClient.Open(String path, FileMode mode, FileAccess access)

2 个答案:

答案 0 :(得分:1)

这是FileMode.Append模式。

似乎Windows OpenSSH服务器不支持它。

当您使用FileMode.Create替换它时,它可以正常工作。

您可以使用FileMode.Append的{​​{1}}参数代替offset

答案 1 :(得分:1)

这在Windows上是OpenSSH的一个问题,并且在Github上提出了一个问题。

https://github.com/PowerShell/Win32-OpenSSH/issues/310