1. 程式人生 > >Java實現遠端連線Linux並執行命令

Java實現遠端連線Linux並執行命令

需要的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.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(); } }