Ganymed-ssh2在openssh4.3时出现SSH_OPEN_ADMINISTRATIVELY_PROHIBITED错误

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连接 (推荐使用)

猜你喜欢

转载自www.cnblogs.com/nnqt-cc/p/8889150.html