900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Java实现通过ssh远程连接主机并执行命令

Java实现通过ssh远程连接主机并执行命令

时间:2019-10-22 04:51:14

相关推荐

Java实现通过ssh远程连接主机并执行命令

需要用到的jar包:

主体代码:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import mons.lang3.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 SshLinux {private static final Logger log = LoggerFactory.getLogger(SshLinux.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.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();}}

注意:ganymed这个jar包,每次只能执行一条命令,如果一条命令执行了没有关闭,再去执行第二条则会thrownewIOException("Aremoteexecutionhasalreadystarted.");

若希望同时执行多条命令,可以在传入的cmd字符串中用&&连接多条命令。

如:

那么多条命令执行的所有结果将会一同作为返回的字符串。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。