jar包版本:Ganymed-ssh2-build210
openSsh版本:4.3
部分代碼如下
Session sess = null;
StringBuffer normal = new StringBuffer();
StringBuffer error = new StringBuffer();
try {
if (!isAlive()) connect();
sess = this.openSession(conn);
sess.execCommand(cmd);// 執行命令
InputStream out = new StreamGobbler(sess.getStdout());// 正常輸出
InputStream err = new StreamGobbler(sess.getStderr());// 異常輸出
BufferedReader outStr = new BufferedReader(new InputStreamReader(out));
BufferedReader errStr = new BufferedReader(new InputStreamReader(err));
String line = "";
while ((line = outStr.readLine()) != null) {
normal.append(line + "\n");
}
while ((line = errStr.readLine()) != null) {
logger.error(line);
error.append(line + "\n");
}
} catch (Exception e) {
logger.error(e.toString(), e);
} finally {
this.closeSession(sess);
}
在finally中對session進行關閉,可是實際情況是在openssh4.3的版本下,session並沒有正常關閉(可能是在低版本的openssh才有的bug,5.3以上版本都可以正常關閉),並且在執行10次命令之后,就會報異常: java.io.IOException: Could not open channel (The server refused to open the channel (SSH_OPEN_ADMINISTRATIVELY_PROHIBITED, 'open failed'))
網上資料找了很久才找到答案,地址:http://www.ganymed.ethz.ch/ssh2/faq.html
由於openssh4.3的max_sessions默認是10,而且采用了硬編碼,要解決該問題,有3種方案:
1、修改openssh4.3的源代碼,重新編譯
2、將並發的session數控制在10以內 (由於session在openssh4.3版本不能正常關閉,所以這種方案不可行)
3、將session分發到多個connection連接 (推薦使用)