使用java连接到SFTP

我需要帮助连接到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.(Unknown Source) at java.net.Socket.(Unknown Source) at com.jcraft.jsch.Util.createSocket(Util.java:252) ... 3 more 

这段代码有什么问题?

您可以尝试增加Jsch Framework的超时。

 session.connect(int Timeout) session.connect(30000); 

有关Jcsh javadoc的更多信息

这是关于Stackoverflow的早期问题,接受的答案建议使用JSch库 。

如何通过SFTP从服务器检索文件?

我看到你试图通过JSch连接并收到错误。

我建议第一件事是检查你是否可以从客户端(你正在测试你的程序的同一台机器)上连接到sftp机器,使用标准的sftp客户端,比如Windows上的Filezilla或者只是终端上的sftp命令在* nix系统中。

我使用JSch库取得了成功。 它的文档非常糟糕,但有传言称它非常严格有效地实现其SSHfunction。

您可以使用Apache commons VFS

 FileSystemManager fsManager = VFS.getManager(); FileObject remoteFile = fsManager.resolveFile("sftp://myusername:mypassword@somehost/pub/downloads/somefile.tgz" ); InputStream in = remoteFile.getContent().getInputStream(); 

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

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

我遇到了与shell连接相同的问题。 解决方案是增加超时,在我的情况下5000毫秒就足够了

 JSch jsch = new JSch(); Session session = jsch.getSession(USERNAME, HOSTNAME, SSH_PORT); session.setPassword(PASSWORD); Hashtable config = new Hashtable(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(5000);