ssh.net sftp坏包长度/开放SSH版本2 RSA?

时间:2013-03-11 00:58:33

标签: c# ssh sftp

我是sftp的新手,我正试图通过sftp将c#程序发送到不受我控制的远程服务器。

使用以下代码:

using (var sftp = new SftpClient(FTPAddress, FTPName, FTPPassword))
                    {
                        ConnectionInfo myCI = sftp.ConnectionInfo;

                        sftp.Connect(); // <<<< Exception on connect

                        sftp.UploadFile(sftp_ms, FileName,true);

                        sftp.Disconnect();
                    }

我收到“错误的数据包长度”异常。

Google搜索显示,错误的数据包长度可能与加密格式不匹配,但我不知道如何解决这个问题。

我从客户收到的规范是:

Keys must be in Open SSH version 2 format RSA format

我不知道该怎么做。之前的SO问题How to resolve a 'Bad packet length' error in SSH.NET?有一个指向sshnet.codeplex讨论的链接,其中删除了您不想要的加密密钥解决了该海报的问题。

我可以在ssh.net的connectioninfo类中看到16个条目但是没有一个表示打开SSH版本2 RSA,虽然其中一个可能很好(我已经尝试了谷歌搜索)。

我已经尝试了ip,名称和密码我已经使用filezilla,我连接没有问题;所以filezilla以某种方式使用正确的加密;我不知道如何判断它的用途。

帮助?

安德鲁

1 个答案:

答案 0 :(得分:0)

这里有两个不同的问题。如果您遇到了错误的数据包长度问题,那么您可能必须按照ssh.net Codeplex讨论中的指南来解决协商问题。这应该解决初始连接的建立。

如果您需要使用ssh私钥进行连接,则必须使用其中一个构造函数来获取PrivateKey对象的数组。 PrivateKey的一个构造函数接受一个流,您可以使用以下代码将私钥字符串转换为流:

var privKey = new PrivateKey(new MemoryStream(Encoding.ASCII.getBytes(sshPrivateKeyString)));
var sftpclient = new SftpClient(FTPAddress, FTPName, new PrivateKeyFile[] { privKey });

其他机制是使用显式的PrivateKeyConnectionInfo实例:

var privKey = new PrivateKey(new MemoryStream(Encoding.ASCII.getBytes(sshPrivateKeyString)));
var privConnInfo = new PrivateKeyConnectionInfo(FTPAddress, FTPName, privKey);
var sftpClient = new SftpClient(privConnInfo);