2015-11-24 34 views
7

Khi kết nối với máy chủ từ xa bằng phiên bản jsch 0.1.51, đôi khi chúng tôi chạy vào ngoại lệ sau khi gọi Channel.connect() trên số .com.jcraft.jsch.JSchException: kênh không mở khi mở kênh trong jsch

com.jcraft.jsch.JSchException: channel is not opened. 
    at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:765) 
    at com.jcraft.jsch.Channel.connect(Channel.java:151) 
    at com.jcraft.jsch.Channel.connect(Channel.java:145) 

Mã chúng tôi sử dụng sau khi phiên đã được tạo ra là:

ChannelExec channel = (ChannelExec) session.openChannel("exec"); 
channel.setCommand("echo hello"); 
channel.connect(); // Error here 

Cuộc gọi Channel.connect() thường trả ở dưới 100 ms, nhưng khi lỗi này ocurrs cuộc gọi bị treo trong hơn 20 giây trước ném ngoại lệ.

Trả lời

12

Thông báo ngoại lệ hơi gây nhầm lẫn. Lỗi có thể xảy ra khi có thời gian chờ đợi thông báo SSH_MSG_CHANNEL_OPEN_CONFIRMATION từ máy chủ. Thời gian chờ mặc định trong jsch (phiên bản 0.1.51) là 20 giây. Tôi nghĩ rằng có những tình huống khác mà cùng một lỗi xảy ra nhưng tôi đã không điều tra thêm.

Mặc dù có thể có nhiều lý do cho thời gian chờ, nhưng chúng tôi đã thấy nó gây ra bởi tra cứu DNS đảo ngược trong sshd từ OpenSSH, đôi khi mất một thời gian dài.

nguyên nhân đó có thể được giải quyết bằng cách tắt tra cứu DNS từ sshd bằng cách thiết lập

UseDNS no 

trong sshd_config của bạn (thường là /etc/ssh/sshd_config). Điều này thường an toàn để làm theo những gì Gilles viết trong this chủ đề.

Tùy chọn khác là tăng thời gian chờ khi kết nối kênh. Channel.connect chấp nhận đối số hết giờ (mili giây), ví dụ: channel.connect(60000). Điều này có thể hữu ích nếu bạn không kiểm soát máy chủ mà bạn đang kết nối.

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