注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

Ganymed SSH-2使用遇到的坑及解决方法  

来自刘成   2015-09-23 17:07:40|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近一段时间在做的一个项目中使用到了Ganymed SSH-2 for Java这个SHH2库,第一次使用这个库,不是很了解,遇到了不少的问题,特别是权限相关的问题,现在就其中一个问题及解决方法跟大家分享下,不足之处请大家多多指教。

首先Ganymed SSH-2除了能ssh到远端机器,同时还可以实现命令的发送,鉴于此实现了以下发送命令的方法:        

  public String sendCommand(String command) throws IOException {        
        boolean flag = true;
        String ret = "";
        Session sess = null;
        try
        {
            logger.info("=========command send==========" + command);
            conn = this.getConnect();
            sess = conn.openSession();
            sess.execCommand(command);            
            InputStream stdout = new StreamGobbler(sess.getStdout());             
            BufferedReader stdoutReader = new BufferedReader(  
                    new InputStreamReader(stdout));              
            while (true) {
                String line = stdoutReader.readLine();
                if (line == null) 
                    break;                
                ret = ret + line;                    
                logger.info("=========command return stdout:" + line);
            }
        catch(Exception e)
        {
                flag = false;
                logger.error("sendCommand fail",e);
                throw new IOException("sendCommand fail");
        }
        finally
        {
            if (null != sess)
            {
                sess.close();
            }
            
            if (null != conn)
            {
                conn.close();
            }
        }
        return ret;
    }


看代码应该没有问题,接下来就是使用了,使用过程中有这样一个场景,用户ssh连接远端机器后,需要向远端机器进行网络异常故障的注入,此处用到iptables命令,我们知道如果我们iptables规则添加成功,终端不会有任何信息返回,我们以此来判断规则是否添加成功,而且iptables命令的执行需要sudo权限,但是该用户并没有sudo权限,那么该用户发送iptables命令,必然返回提示信息输入password;但实际使用上面的方法发送命令过程中并没有返回任何信息,跟我们预期的结果不一致,问题来了,为什么有信息并没有返回,回来看我们的实现逻辑,并没有发现其他问题,那么源头指向了发送命令的这个方法。

定位方法中输出信息的获取,可以看到getStdout,但没有getStderr,也就是说只有对标准输出进行了处理,对于错误输出没有进行处理,问题指定出在这了,针对这个问题进行修改,修改代码如下:

 InputStream stdout = new StreamGobbler(sess.getStdout());  
            InputStream stderr = new StreamGobbler(sess.getStderr());  
            BufferedReader stdoutReader = new BufferedReader(  
                    new InputStreamReader(stdout));  
            BufferedReader stderrReader = new BufferedReader(  
                    new InputStreamReader(stderr)); 
            while (true) {
                String line = stdoutReader.readLine();
                if (line == null) 
                    break;                
                ret = ret + line;                    
                logger.info("=========command return stdout:" + line);
            }
            
            while (true) {
                String line = stderrReader.readLine();
                if (line == null) 
                    break;                
                ret = ret + line;                    
                logger.info("=========command return stderr:" + line);
            }

         
添加了对错误输出的处理逻辑,如果有错误输出,将错误信息返回,这样看问题似乎得到了解决,试用验证是否会出现问题,通过试用前面遇到的问题解决了,接下来就是其他场景的使用,项目中其他人员调用这个方法发送命令来获取返回结果时,有些场景会同时返回正确和错误信息,但是错误信息是他们不需要关心的,他们的使用场景中只需验证标准输出是否正确,方法的改动影响了许多其他功能的实现,针对这个问题该如何解决,首先想到的是修改接口,将标准输出与错误输出分别进行返回;其次是方法的重载,重载一个独享的方法;但这两种方法需要对整个工程代码进行调整,代价比较大,最好能有其他解决方法。回头看错误输出使用到的场景,发送命令,根据是否有错误信息返回来进行判断,并未对错误的具体信息进行判断,那么方法来了,就是重定向,将标准错误输出冲定向到标准输出,这样就很容易达到我们想要的结果,而且代码调整较为简单。

具体实现在发送命令时添加重定向信息:  

   如发送以下命令:
    sudo iptables -A OUTPUT -p tcp -d qa10.server.163.org --dport 8181 -j DROP
    修改为发送如下命令:
    sudo iptables -A OUTPUT -p tcp -d qa10.server.163.org --dport 8181 -j DROP 2>&1
    将2(stderr)重定向到1(stdout),问题得到完美解决


以上便是跟大家分享的内容,如果你有好的方法愿意分享出来欢迎分享,谢谢!
  评论这张
 
阅读(479)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016