2013-12-13 12 views
5

Tôi đang kết nối với máy chủ FTP qua sftp (JSCH).JSCH: SFTP. Treo tại session.connect() bằng cổng 21

Làm thêm giờ tôi kết nối với máy chủ FTP bằng cổng 21, nó luôn bị treo tại session.connect().

Nó không loại trừ bất kỳ ngoại lệ nào. Nhưng khi tôi sử dụng các cổng khác. Nó hoạt động và nó ném ngoại lệ.

Có cách nào tôi có thể bắt lỗi không?

Đây là mẫu mã của tôi.

public static void main(String[] args) throws SftpException { 

    JSch jsch = new JSch(); 

    try { 

     Session session = jsch.getSession("username", "host", 21); 
     session.setConfig("StrictHostKeyChecking", "no"); 
     session.setPassword("password"); 
     session.connect(); 

     Channel channel = session.openChannel("sftp"); 
     channel.connect(); 
     ChannelSftp channelSftp = (ChannelSftp) channel; 
     session.disconnect(); 
     channelSftp.disconnect(); 

    } catch (JSchException e) { 
     log("Cannot make connection to FTP server "); 
     e.printStackTrace(); 

    } 

} 
+0

Không có 'cổng khác'. Cổng 22 là cổng SSH. Port 21 chắc chắn là không. – EJP

+0

tôi biết không có cổng nào khác. Vấn đề của tôi là tôi đã mong đợi nó ném một ngoại lệ. Nhưng nó chỉ bị treo trong session.connect() – aeycee

Trả lời

6

Có thể cổng 22 là cổng mặc định cho SFTP không? Và một máy chủ FTP chạy trên cổng 21 sẽ không biết cách đàm phán cuộc hội thoại cho FTP an toàn. Về cơ bản, SFTP là FTP qua SSH.

CHỈNH SỬA: Vấn đề là, nó đang chờ đợi vô thời hạn để thương lượng hoàn thành. Đây là một trận đấu giữa Mexico và cả hai đều không chịu thua. Hãy gọi session.setTimeout() trước session.connect() hoặc gọi session.connect(timeout), với một số giá trị phù hợp (3-5 giây). Tôi tin rằng thời gian chờ tính bằng mili giây.

+0

Vấn đề của tôi chỉ là khi người dùng nhập vào cổng ngoài 22. Tôi đã hy vọng rằng JSCH sẽ ném một ngoại lệ. Vấn đề của tôi là nó không ném bất kỳ lỗi nào. Tôi chỉ bị treo trong session.connect(). Khi tôi sử dụng cổng 22 tôi có thể kết nối thành công với máy chủ FTP. – aeycee

+1

Xem các chỉnh sửa trả lời ở trên. – brettw

+1

Cảm ơn rất nhiều. Nó đang làm việc bây giờ. – aeycee

6

Tôi gặp sự cố tương tự nhưng với cổng chính xác. session.connect() chỉ bị treo và không trả lại bất kỳ thứ gì. Trong khi các chương trình khác có thể kết nối thành công.

Lý do là máy chủ cung cấp nhiều phương thức xác thực hơn và chúng tôi phải trỏ Jsch chỉ sử dụng mật khẩu.

 java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     config.put("PreferredAuthentications", "password"); 
     session.setConfig(config); 
+0

Vấn đề của tôi là session.connection() sẽ mất tối đa 40 giây mỗi lần khi kết nối với SFTP, sau khi thiết lập các thuộc tính này, nó kết nối sau 1-2 giây. –

1

Chúng tôi đang chạy JSch từ webMethods máy chủ. Sau khi nâng cấp lên phiên bản mới khi chúng tôi cố gắng kết nối với một trong các đối tác của chúng tôi, nó bị treo trên bước kết nối.

Giải pháp được đề xuất ở đây không hoạt động. Tôi đã nhận lỗi này:

com.jcraft.jsch.JSchException: Auth thất bại

tôi đã nhận thấy các máy chủ, chúng tôi đang cố gắng để kết nối với là yêu cầu cho người sử dụng và mật khẩu trước khi kết nối được được thực hiện:

[[email protected] sftpTest]$ /opt/sag/95/sitcore/jvm/jvm/bin/java -jar  
SftpConnect.jar 
Password has been set 
Timeout has been set 
Kerberos username [sagtest]: 
Kerberos password for sagtest: 
Connected 
Channel opened 
Connected 
Session: iui-bpjobs01.itservices.lan:22:bp-xfer-int:1738666864 

Không được có người dùng và mật khẩu Kerberos.

Sau khi điều tra nhỏ tôi đã tìm thấy trang này: Skipping Kerberos authentication prompts with JSch

Sau khi thiết lập PreferredAuthentications với các giá trị khác - tất cả đã làm việc tốt. Mã mà tôi đã thêm:

session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); 

Dưới đây là toàn bộ ví dụ mà tôi đã có - có thể nó sẽ giúp một ai đó để gỡ rối vấn đề của bạn:

public static void main (String[] args){ 
    String serverport = "22"; 
    String serverhost = "XXXX"; 
    String username = "YYYY"; 
    String password = "ZZZZZ"; 
    int timeout = 5000; 
    try{ 
     int port = 22; 
     String sessionkey = null; 
     if(serverport != null && !serverport.trim().equals("")) 
      port = Integer.parseInt(serverport); 
     JSch jsch=new JSch(); 

     Session session=jsch.getSession(username, serverhost, port); 
     jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts"); 

     session.setPassword(password); 
     System.out.println("Password has been set"); 
     if(timeout > 0){ 
      session.setTimeout(timeout); 
      System.out.println("Timeout has been set"); 
     } 
     session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); 
     System.out.println("Added PreferredAuthentications"); 
     session.connect(); 
     System.out.println("Connected"); 

     Channel channel = session.openChannel("sftp"); 
     System.out.println("Channel opened"); 
     channel.connect(); 
     System.out.println("Connected"); 
     if (channel.isConnected()){ 
      sessionkey = serverhost + ":" + serverport + ":" + username + ":" + Thread.currentThread().hashCode(); 
     } 
     System.out.println("Session: "+sessionkey); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
0

Trong trường hợp của tôi, chỉ cập nhật JSch Phiên bản mới nhất (hiện tại 1.50) đã khắc phục sự cố, dường như có sự không tương thích trong bắt tay khóa/auth với các phiên bản JSch cũ hơn kết hợp với phiên bản OpenSSH mới nhất 7.1.x

Các vấn đề liên quan