您的位置:首页 > 运维架构 > Linux

Java实现远程连接Linux并执行命令

2018-02-09 10:37 691 查看
需要的jar包

<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>${ganymed-ssh2}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>


连接及执行命令代码

package com.kpatch.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

public class RemoteCommandUtil {

private static final Logger log = LoggerFactory.getLogger(RemoteCommandUtil.class);
private static String  DEFAULTCHART="UTF-8";

/**
* 登录主机
* @return
*      登录成功返回true,否则返回false
*/
public static Connection login(String ip,
String userName,
String userPwd){

boolean flg=false;
Connection conn = null;
try {
conn = new Connection(ip);
conn.connect();//连接
flg=conn.authenticateWithPassword(userName, userPwd);//认证
if(flg){
log.info("=========登录成功========="+conn);
return conn;
}
} catch (IOException e) {
log.error("=========登录失败========="+e.getMessage());
e.printStackTrace();
}
return conn;
}

/**
* 远程执行shll脚本或者命令
* @param cmd
*      即将执行的命令
* @return
*      命令执行完后返回的结果值
*/
public static String execute(Connection conn,String cmd){
String result="";
try {
if(conn !=null){
Session session= conn.openSession();//打开一个会话
session.execCommand(cmd);//执行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
//如果为得到标准输出为空,说明脚本执行出错了
if(StringUtils.isBlank(result)){
log.
bd3b
info("得到标准输出为空,链接conn:"+conn+",执行的命令:"+cmd);
result=processStdout(session.getStderr(),DEFAULTCHART);
}else{
log.info("执行命令成功,链接conn:"+conn+",执行的命令:"+cmd);
}
conn.close();
session.close();
}
} catch (IOException e) {
log.info("执行命令失败,链接conn:"+conn+",执行的命令:"+cmd+"  "+e.getMessage());
e.printStackTrace();
}
return result;
}
/**
* 解析脚本执行返回的结果集
* @param in 输入流对象
* @param charset 编码
* @return
*       以纯文本的格式返回
*/
private static String processStdout(InputStream in, String charset){
InputStream  stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));
String line=null;
while((line=br.readLine()) != null){
buffer.append(line+"\n");
}
} catch (UnsupportedEncodingException e) {
log.error("解析脚本出错:"+e.getMessage());
e.printStackTrace();
} catch (IOException e) {
log.error("解析脚本出错:"+e.getMessage());
e.printStackTrace();
}
return buffer.toString();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: