访问 Windows OpenSSH SFTP 服务器上的文件时出现错误“错误消息”
Posted
技术标签:
【中文标题】访问 Windows OpenSSH SFTP 服务器上的文件时出现错误“错误消息”【英文标题】:Error "Bad message" when accessing a file on Windows OpenSSH SFTP server 【发布时间】:2017-01-16 15:30:42 【问题描述】:我需要通过 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 异常 - 基本上是任何返回 Stream
或 StreamWriter
的操作。
我通过 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)
【问题讨论】:
您使用的是什么版本的 SSH.NET 和 OpenSSH? 您是否使用普通控制台应用程序获得相同的结果? IE。没有异步代码。您应该在发布问题之前创建minimal reproducible example。 嘿@MartinPrikryl 我已经用更简单的代码 sn-p 更新了我的问题。在回答你的问题时,它排除了 WebApi、请求解析器和异步的东西。 另外,我第一次涉足 SFTP 并在 Windows 上设置 SSH。 WinSCP 网站是一个很棒的资源! 【参考方案1】:这是FileMode.Append
模式。
Windows OpenSSH 服务器好像不支持。
当您将其替换为 FileMode.Create
时,它会起作用。
您可以使用SftpFileStream.Write
的offset
参数来代替FileMode.Append
。
【讨论】:
不幸的是,删除前导斜杠会产生相同的结果。此外,使用带有前导斜杠的路径的其他命令(如创建目录和空文件)似乎可以工作,而不管前导斜杠 嗯,对我有用。对我来说,即使是Client.Create
也会以斜线开头。
无论如何,您可以使用任何命令行 SFTP 客户端上传文件,例如使用 WinSCP:winscp.com /command "upload sftp://username@password@host/" "put D:\Temp\TestFile.xml D:/sftp/test.xml" "exit"
+ 您甚至可以在 WinSCP GUI 中浏览到 D:/sftp
吗?
我曾希望我能够做到这一点,但不幸的是,出于安全原因,我无法将文件存储在临时位置。发布的文件必须保存在内存中,并且只能在 SFTP 服务器上实现
好吧,在其他机器上用随机文件试试。【参考方案2】:
这原来是 Windows 上的 OpenSSH 的一个问题,并且在 Github 上提出了一个问题。
https://github.com/PowerShell/Win32-OpenSSH/issues/310
【讨论】:
以上是关于访问 Windows OpenSSH SFTP 服务器上的文件时出现错误“错误消息”的主要内容,如果未能解决你的问题,请参考以下文章
想要使用 c++ 或 perl 使用 OpenSSH 和 SFTP 通过 Internet 发送文件---Windows Vista 两者