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

JAVA学习网 2018-04-20 21:17:02

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

阅读(751) 评论(0)