使用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();
}