使用ganymed-ssh2连接linux服务器执行命令,执行成功有返回值,执行失败无返回值。

使用ganymed-ssh2这个工具向linux发送命令执行,并获取执行结果返回。代码如下:

public String exec(String[] cmd) throws Exception {
    String returnValue = "";
    try {
        if (connect()) {
            //打开一个会话
            session = conn.openSession();
            //执行命令,多条命令分号隔开
            session.execCommand(StringUtils.join(cmd, ";"));
            log.info("执行命令: {}", StringUtils.join(cmd, ";"));
            returnValue = processStdout(session.getStdout());
        } else {
            log.error("连接失败。");
        }
    } catch (IOException e) {
        log.error("执行命令 {} 失败。", StringUtils.join(cmd, ";"));
        e.printStackTrace();
        throw new Exception("执行命令 " + StringUtils.join(cmd, ";") + " 失败。");
    } finally {
        close();
    }

    return returnValue;
}

private String processStdout(InputStream in) {
    InputStream stdout = new StreamGobbler(in);
    StringBuffer buffer = new StringBuffer();
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(stdout, CHARSET));
        String line;
        while ((line = br.readLine()) != null) {
            buffer.append(line).append(";\n");
        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return buffer.toString();
}

当命令执行成功的时候,可以正常获取到返回结果,但是当命令执行失败以后就获取不到返回值了,很郁闷呀,经过两个小时的排查终于找到原因了:
原来是 session.getStdout()方法获取到的返回值只是命令执行成功的返回值,而命令执行失败的返回值需要用session.getStderr()方法去获取。
修改后的代码如下:

public String exec(String[] cmd) throws Exception {
    String returnValue = "";
    try {
        if (connect()) {
            //打开一个会话
            session = conn.openSession();
            //执行命令,多条命令分号隔开
            session.execCommand(StringUtils.join(cmd, ";"));
            log.info("执行命令: {}", StringUtils.join(cmd, ";"));
            returnValue = processStdout(session.getStdout());
            if(StringUtils.isEmpty(returnValue))
            {
                returnValue = processStdout(session.getStderr());
            }
        } else {
            log.error("连接失败。");
        }
    } catch (IOException e) {
        log.error("执行命令 {} 失败。", StringUtils.join(cmd, ";"));
        e.printStackTrace();
        throw new Exception("执行命令 " + StringUtils.join(cmd, ";") + " 失败。");
    } finally {
        close();
    }

    return returnValue;
}

private String processStdout(InputStream in) {
    InputStream stdout = new StreamGobbler(in);
    StringBuffer buffer = new StringBuffer();
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(stdout, CHARSET));
        String line;
        while ((line = br.readLine()) != null) {
            buffer.append(line).append(";\n");
        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return buffer.toString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值