【问题标题】:SFTP connection error: connection timeoutSFTP 连接错误:连接超时
【发布时间】:2014-08-26 09:20:21
【问题描述】:

我正在尝试使用 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,但仍然出现此错误。怎么了?

统一更新: 我无法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-nd 端口。

附言

大多数参数不是真实的。不要尝试自己ping它。我只是不想与您共享主机、用户名和密码。

【问题讨论】:

  • # host -a prod-sftp.host.ru prod-sftp.host.ru does not exist (Authoritative answer)
  • But telnet can connect to 22-nd port. 我对此表示怀疑。你得到了什么?
  • @PeterMmm,我当然改变了这个问题的参数。我也不想分享我的密码和用户名。
  • 所以prod-sftp.host.ru 不是您要连接的主机?因为所有点都表明服务器在端口3232上不可用。
  • 不,不是。我想我应该说更多细节。等一下。

标签: java sftp jsch


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您是否尝试过指定超时? 之前可以这样做:

    session.connect();

    通过添加:

    session.setTimeout(20000);

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

    jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");

    问候,

    康基

    【讨论】:

      【解决方案3】:

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

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

      • 首先检查您的服务器是否已使用 ping 启动。
      • 然后尝试使用 telnet 连接到控制端口。
      • 如果到目前为止可以正常工作,请检查它是 sFTP 还是 FTP。
      • 由于真正的通信将通过另一个端口进行协商,请检查您的 nat/防火墙。来自 FTP 服务器的握手可能不会通过它。

      您始终可以使用另一个 FTP 客户端先检查连接,例如 lftp。

      【讨论】:

      • 作为网络/系统管理员,我建议跳过第一步。我们通常会在所有网络设备上禁用 ping,以进一步防止偶然的网络发现。
      • @NonSecwitter 那么你如何检查主机和跟踪路由呢?
      • 我应该说,就服务器和工作站而言,我们通常不使用 ICMP。我只遇到了少数需要它的实例,然后我可以暂时重新打开它。这不是最糟糕的事情,但在目前的工作之前,我在一个高度安全的环境中工作。 (结果我可能有点偏执)
      猜你喜欢
      • 2013-03-10
      • 1970-01-01
      • 2022-11-21
      • 2018-07-24
      • 1970-01-01
      • 2013-05-29
      • 2013-03-30
      • 2017-07-12
      相关资源
      最近更新 更多