2017-04-11 1 views
0

파일을 FTP 서버에 업로드하기 위해 콘솔 응용 프로그램을 만들었습니다. 이 FTP 서버는 SFTP 프로토콜 만 받아들이므로 .NET에 메서드가 내장되어 있지 않아 SSH.NET 오픈 소스 라이브러리를 사용하고 있습니다 (Visual Studio 2008 Professional에서 사용하는 .NET 3.5는 적습니다).SSH.NET을 사용하여 SFTP로 파일 업로드 : 연결할 수 없습니다.

나는 많은 예제를 보았습니다. 공용 SFTP 서버에 연결하고 SFTP 프로토콜을 사용하여 파일을 업로드하는 빠른 테스트 응용 프로그램을 구현했습니다. 나는 공공 무료 SFTP의 here에서 얻은 서버 아래에 사용하고

:

연결하려고 할 때 :

const string host    = "demo.wftpserver.com"; 
    const string username   = "demo-user"; 
    const string password   = "demo-user"; 
    const string workingdirectory = "/upload"; 
    const string uploadfile  = @"C:\test.txt"; 
    const int port    = 2222; 

    static void Main(string[] args) 
    { 
     try 
     {     
      using (SftpClient client = new SftpClient(host, port, username, password)) 
      { 
       { 
        client.Connect(); 
        Console.WriteLine("Connected to {0}", host); 

        client.ChangeDirectory(workingdirectory); 
        Console.WriteLine("Changed directory to {0}", workingdirectory); 

        var listDirectory = client.ListDirectory(workingdirectory, null); 
        Console.WriteLine("Listing directory:"); 
        foreach (var fi in listDirectory) 
        { 
         Console.WriteLine(" - " + fi.Name); 
        } 

        using (var fileStream = new FileStream(uploadfile, FileMode.Open)) 
        { 
         Console.WriteLine("Uploading {0} ({1:N0} bytes)", uploadfile, fileStream.Length); 
         client.BufferSize = 4 * 1024; // bypass Payload error large files 
         client.UploadFile(fileStream, Path.GetFileName(uploadfile), null); 
        } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Console.Out.WriteLine(e.Message); 
     } 

문제는 다음과 같다 : 여기

server : demo.wftpserver.com 
user  : demo-user 
password : demo-user 
port  : 2222 

그리고 코드입니다 서버는 아래 문장을 사용합니다 :

client.Connect(); 

예외가 있습니다. 예외는 다음과 말했다 :

"Value cannot be null. \r\nParameter name: All lists are either null or empty." 

StackTrace " at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)\r\n at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle)\r\n at Renci.SshNet.Session.Connect()\r\n at Renci.SshNet.BaseClient.Connect()\r\n at ConsoleApplication2.Program.Main(String[] args) at C:\\Users\\Win7\\Downloads\\ConsoleApplication2\\ConsoleApplication2\\Program.cs:line 61" string 

은 또한, 나는 here하지만 성공하지 설명으로 시간 제한을 변경하는 것을 시도했다.

그러나 FileZilla 클라이언트에서 동일한 자격 증명을 사용하여 동일한 SFTP 서버에 연결하려고하면 문제없이 연결할 수 있으며 파일을 업로드 할 수도 있습니다.

그래서 무슨 일이 일어나고 있는지 이해할 수 없습니다. 누군가 나를 도울 수 있습니까?

업데이트 : 이 항목을 찾았습니다. fix. 이 패치는 2017 년 1 월 22 일에 brank 개발에 적용되었지만 다운로드 할 수있는 마지막 바이너리는 2016 년 12 월 14 일입니다. 따라서이 수정 사항을 포함하는 바이너리를 어떻게 구할 수 있습니까?

답변

1

해결했습니다.

이 버그가 수정 된 개발자 지점에서 소스 코드를 다운로드했습니다. 그런 다음 Visual Studio 2015에서 .NET Framework 3.5 프로젝트를 열고 빌드합니다. 그래서 바이너리 DLL을 릴리스 및 디버그 용으로 확보했습니다. 그런 다음 Visual Studio 2008 프로젝트로 돌아와이 참조를 추가합니다. 그리고 동일한 코드를 사용하여 동일한 자격 증명으로 FTP 서버에 연결할 수 있는지 확인했습니다.

SSH.NET 웹에 제공된 마지막 바이너리에는이 버그가 수정되지 않았습니다.

-3

나는 우리 SFTP에서 파일을 보내기 위해 Tamir.SharpSSH를 사용했습니다. 이 코드를 사용해보십시오. 코드는 sftp로 파일을 보내는 가장 간단한 방법입니다.

Sftp sftpBase = new Tamir.SharpSsh.Sftp(_sftpHost, _sftpUid, Up_decryptPass); 
sftpBase.Connect(int.Parse(_sftpPort)); 
sftpBase.Put(Dir + filename, sftpDir); 
+1

SharpSSH는 (는) 죽은 프로젝트입니다. 사용하지 마십시오. 웹 사이트도 다운 된 상태입니다. –

+0

죽지 않았어. 우리는 현재이 프로젝트에서 사용하고 있습니다. –

+0

마지막 버전은 2011 년이고 웹 페이지는 2007 년부터 업데이트되지 않았습니다. 그게 내가 보안 관련 라이브러리에 대해 죽은 것입니다. 현대 암호는 지원할 수 없습니다. –

관련 문제