2011-06-09 143 views
1

我需要帮助连接到SFTP服务器?有人有工作代码吗?使用java连接到SFTP

,我发现这样的事情

package test.JSch; 

import com.jcraft.jsch.*; 

public class TestJSch { 
public static void main(String args[]) { 
    JSch jsch = new JSch(); 
    Session session = null; 
    try { 
     session = jsch.getSession("USSERNAME", "HOST", 22); 
     //session.setConfig("StrictHostKeyChecking", "no"); 
     session.setPassword("PASSWORD"); 
     System.out.println("1"); 
     session.connect(); 
     System.out.println("2"); 

     Channel channel = session.openChannel("sftp"); 
     System.out.println("3"); 
     channel.connect(); 
     System.out.println("4"); 
     ChannelSftp sftpChannel = (ChannelSftp) channel; 
     sftpChannel.get("remotefile.txt", "localfile.txt"); 
     sftpChannel.exit(); 
     session.disconnect(); 
    } catch (JSchException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } catch (SftpException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

但这是输出

com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect 
    at com.jcraft.jsch.Util.createSocket(Util.java:258) 
    at com.jcraft.jsch.Session.connect(Session.java:186) 
    at com.jcraft.jsch.Session.connect(Session.java:145) 
    at test.JSch.TestJSch.main(TestJSch.java:17) 
Caused by: java.net.ConnectException: Connection timed out: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at com.jcraft.jsch.Util.createSocket(Util.java:252) 
    ... 3 more 

什么是错的代码?

+1

当你说它不起作用时,你可以更具体吗?你有什么异常?它是否编译?你在用什么库? – 2011-06-09 09:22:09

回答

1

这是Stackoverflow的一个早期问题,接受的答案建议使用JSch library

How to retrieve a file from a server via SFTP?

我看到你试图通过JSch连接并得到了一个错误。

我建议首先要检查您是否可以从客户端(您正在测试您的程序的同一台计算机)连接到sftp计算机,使用标准的sftp客户端(如Windows上的Filezilla)或者仅仅是sftp命令在* nix系统中的终端上。

0

我已经成功使用JSch library。臭名昭着的文档很糟糕,但传闻要非常严格和高效地实施其SSH功能。

0

您可以使用Apache commons VFS

FileSystemManager fsManager = VFS.getManager(); 
FileObject remoteFile = fsManager.resolveFile("sftp://myusername:[email protected]/pub/downloads/somefile.tgz"); 
InputStream in = remoteFile.getContent().getInputStream(); 
+0

VFS不是一大堆不同类型的文件管理工具,它们都依赖于其他几个jar文件?如果OP只需要SFTP部分,那么VFS会有点过分。 – deltaforce2 2011-06-09 12:37:28

+0

它看起来已经过时 – Njax3SmmM2x2a0Zf7Hpd 2013-12-16 17:17:33

+0

http://code.google.com/p/otrosvfsbrowser/正在使用Apache Commons VFS ver.2浏览包括SFTP在内的远程文件系统。它工作得很好。 – KrzyH 2013-12-18 11:40:21

2

您可以尝试增加对Jsch框架超时。

session.connect(int Timeout) 

session.connect(30000); 

更多关于Jcsh javadoc

+0

超时以毫秒或秒为单位? – Maverick 2016-01-25 13:27:01

0

JSch API:session.connect(); 再次询问用户名和密码连接到服务器,即使这些作为参数传递。

如何使代码避免再次询问用户名和密码。