SFTP连接错误:连接超时

时间:2014-08-26 09:20:21

标签: java sftp jsch

我尝试使用jsch库连接到SFTP服务器。这就是我的方式:

public class SFTPConnection {

    private String sftpHost;
    private String sftpUser;
    private String sftpPass;
    private String sftpWorkDir;
    private Session session = null;
    private Channel channel = null;
    private ChannelSftp channelSftp = null;

    static final String SFTPHOST = "prod-sftp.host.ru";
    static final String SFTPUSER = "user";
    static final String SFTPPASS = "pass";
    static final String SFTPWORKINGDIRINC = "/dir/Port_Increment/";
    static final String SFTPWORKINGDIRFULL = "/dir/Port_All_Full/";

    public  SFTPConnection(String sftpHost, String sftpUser, String sftpPass, String sftpWorkDir) throws JSchException, SftpException {
        this.sftpHost = sftpHost;
        this.sftpUser = sftpUser;
        this.sftpPass = sftpPass;
        this.sftpWorkDir = sftpWorkDir;

        JSch jsch = new JSch();

        session = jsch.getSession(this.sftpUser, this.sftpHost, 3232);
        session.setPassword(this.sftpPass);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        channel = session.openChannel("sftp");
        channel.connect();
        channelSftp = (ChannelSftp) channel;
        channelSftp.cd(this.sftpWorkDir);
    }

    public SFTPConnection() throws JSchException, SftpException {

        sftpWorkDir = SFTPWORKINGDIRINC;
        JSch jsch = new JSch();
        session = jsch.getSession(SFTPUSER, SFTPHOST, 3232);
        session.setPassword(SFTPPASS);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        channel = session.openChannel("sftp");
        channel.connect();
        channelSftp = (ChannelSftp) channel;
        channelSftp.cd(SFTPWORKINGDIRINC);
    }

    public static void main(String[] args) {
        try {
            SFTPConnection con=new SFTPConnection();
        } catch (JSchException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        }
    }
}

此代码适用于我的计算机,但现在我需要将其部署在另一台具有高安全级别的服务器上。这就是我所拥有的。 例外是:

com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect
    at com.jcraft.jsch.Util.createSocket(Util.java:344)
    at com.jcraft.jsch.Session.connect(Session.java:215)
    at com.jcraft.jsch.Session.connect(Session.java:183)
    at SFTPConnection.<init>(SFTPConnection.java:53)
    at SFTPConnection.main(SFTPConnection.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at com.jcraft.jsch.Util.createSocket(Util.java:338)
    ... 9 more

我尝试使用相同参数的WinSCP进行连接。我试图将端口从3232更改为22,但仍然是此错误。怎么了?

UPD: 我无法ping prod-sftp.host.ru

Pinging #ipaddress# with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

但是telnet可以连接到第22个端口。

PS

大多数参数都不是真实的。不要试图自己ping它。我只是不想与你分享主机,用户名和密码。

3 个答案:

答案 0 :(得分:3)

您是否尝试过禁用任何一方的防火墙,众所周知,Java FTP被许多防火墙阻止。

您是否尝试使用Filezilla等其他软件检查主机是否在主机上可用,只是为了确保错误在您的代码中而不是其他地方,例如主机名拼写错误等。

答案 1 :(得分:0)

当您的堆栈跟踪告诉您时,客户端无法与服务器建立连接。你正在使用ftp,它不能很好地应对当今的网络基础设施。您可能应该查看RFC连接的RFC。

简而言之,您的客户端只是为了协商另一个通信端口而连接到服务器的控制端口。

  • 首先检查一下,您的服务器正在使用ping。
  • 然后尝试使用telnet连接到控制端口。
  • 如果它到目前为止工作,请检查它是sFTP还是FTP。
  • 由于真正的通信将被另一个端口协商,请检查你的nat / firewall。来自FTP服务器的握手可能无法通过它。

您可以随时使用其他FTP客户端检查连接,例如lftp

答案 2 :(得分:0)

您是否尝试过指定超时? 你可以在之前做到:

session.connect();

添加:

session.setTimeout(20000);

在我的代码中,我还添加了这个:

jsch.setKnownHosts(System.getProperty( “的user.home”)+ “/ SSH / known_hosts中。”);

此致

Konki

相关问题