最近经常会用到java到指定机器上执行终端命令并且获得返回结果,所以借此机会来记录一下
1.首先通过ip,用户名,密码链接到远程服务器上,然后执行终端命令
userName:主机的用户名,password:密码,ipAddr:主机ip地址,cmd:你要执行的命令
public String execute(String userName, String password, String ipAddr, String cmd) {
String result = "";
boolean isAuthed = false;
try {
if (InetAddress.getByName(ipAddr).isReachable(1500)) {
Connection conn = new Connection(ipAddr);
conn.connect();
isAuthed = conn.authenticateWithPassword(userName, password);
if (isAuthed) {
Session session = conn.openSession();//打开一个会话
session.execCommand(cmd);
result = processStdout(session.getStdout());
//如果为得到标准输出为空,说明脚本执行出错了
if (StringUtils.isBlank(result)) {
log.info("得到标准输出为空,链接conn:" + conn + ",执行的命令:" + cmd);
result = processStdout(session.getStderr());
} else {
log.info("执行命令成功,链接conn:" + conn + ",执行的命令:" + cmd);
}
session.close();
conn.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
2.获取终端命令的返回结果
private static String processStdout(InputStream in) {
InputStream stdout = new StreamGobbler(in);
StringBuilder buffer = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout, StandardCharsets.UTF_8));
String line;
while ((line = br.readLine()) != null) {
buffer.append(line).append("\n");
}
} catch (IOException e) {
log.error("解析脚本出错:" + e.getMessage());
}
return buffer.toString();
}
需要注意的是,如果想输入多条命令,命令之间可以用" && "连接,比如 "cd /home && ls"