2013-03-11 38 views
0

我是新来的sftp,我试图让一个c#程序通过sftp发送一个文件到一个不受我控制的远程服务器。ssh.net sftp坏包长度/打开SSH版本2 RSA?

使用如下代码:

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(); 
        } 

我收到 “坏数据包长度” 的例外。

谷歌搜索揭示了一个错误的数据包长度很可能是加密的格式不匹配,但我不知道如何解决这个问题。

我从客户端接收所规格为:

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以某种方式使用正确的加密;我不知道如何说出它的用途。

帮助?

Andrew

+0

什么是FTPPassword的类型?它可能会为ctor使用错误的超载。另外,您确定远程服务器接受用户名/密码验证而不是公用密钥验证吗? – 2013-03-11 01:10:29

+0

所有字符串;但如果这是超载的问题,它会错误的建设,而不是连接?至于远程服务器,当我将该IP,用户名和密码放入filezilla时,它会成功连接,然后我可以传输文件。 – andrew 2013-03-11 01:51:19

回答

0

这里有两个不同的问题。如果您收到了错误的数据包长度的问题,那么你可能必须遵循ssh.net Codeplex讨论引导到解决的谈判。这应该可以解决建立初始连接的问题。

如果你需要使用一个SSH私钥进行连接,那么你必须使用需要专用密钥对象的数组构造函数中的一个。其中构造一个专用密钥的接受一个流,你可以使用代码的私有密钥字符串转换为数据流,如:

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); 
+0

晚回复抱歉;对于未来搜索的详细信息:从我的理解,如果您使用的用户名/密码,SFTP,你不需要公共/私有密钥,因为身份验证是通过用户名/密码;在没有用户/密码登录的情况下需要公共/私人。我错误地试图做到这两点 – andrew 2013-06-19 05:27:52