访问 Windows OpenSSH SFTP 服务器上的文件时出错 "Bad message"
Error "Bad message" when accessing a file on Windows OpenSSH SFTP server
我需要通过 SFTP 从网站传输大文件。我无法将这些文件(甚至是暂时的)存储在 Web 服务器上,因此我将文件分块流式传输到 SFTP 服务器。
我已经安装了 OpenSSH(version 5_30_2016) on another Windows machine and am attempting to connect to it using 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 异常 - 基本上是 returns Stream
或 StreamWriter
.[=17 的任何操作=]
我通过 SFTP 客户端返回的错误是 "Bad Message",这不是很清楚。我只是希望我在我的方法中错过了一些明显的东西......!
我也试过使用其他 SFTP 库,但它们似乎都依赖于将物理本地文件传递到远程位置,这不是我想要做的。 SSH.NET 似乎最适合我的需求,因为它提供了将字节数组和流传递到 SFTP 服务器的方法
堆栈跟踪,消息 "Bad Message":
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)
是FileMode.Append
模式。
看来WindowsOpenSSH服务器不支持
当您将其替换为 FileMode.Create
时,它起作用了。
您可以使用 SftpFileStream.Write
的 offset
参数代替 FileMode.Append
。
这原来是 Windows 上的 OpenSSH 问题,Github 上提出了一个问题。
我需要通过 SFTP 从网站传输大文件。我无法将这些文件(甚至是暂时的)存储在 Web 服务器上,因此我将文件分块流式传输到 SFTP 服务器。
我已经安装了 OpenSSH(version 5_30_2016) on another Windows machine and am attempting to connect to it using 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 异常 - 基本上是 returns Stream
或 StreamWriter
.[=17 的任何操作=]
我通过 SFTP 客户端返回的错误是 "Bad Message",这不是很清楚。我只是希望我在我的方法中错过了一些明显的东西......!
我也试过使用其他 SFTP 库,但它们似乎都依赖于将物理本地文件传递到远程位置,这不是我想要做的。 SSH.NET 似乎最适合我的需求,因为它提供了将字节数组和流传递到 SFTP 服务器的方法
堆栈跟踪,消息 "Bad Message":
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)
是FileMode.Append
模式。
看来WindowsOpenSSH服务器不支持
当您将其替换为 FileMode.Create
时,它起作用了。
您可以使用 SftpFileStream.Write
的 offset
参数代替 FileMode.Append
。
这原来是 Windows 上的 OpenSSH 问题,Github 上提出了一个问题。