1. 程式人生 > 程式設計 >基於Java實現ssh命令登入主機執行shell命令過程解析

基於Java實現ssh命令登入主機執行shell命令過程解析

這篇文章主要介紹了基於Java實現ssh命令登入主機執行shell命令過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1、SSH命令

SSH 為 Secure Shell 的縮寫,由 IETF 的網路小組(Network Working Group)所制定;SSH 為建立在應用層基礎上的安全協議。SSH 是較可靠,專為遠端登入會話和其他網路服務提供安全性的協議。利用 SSH 協議可以有效防止遠端管理過程中的資訊洩露問題。SSH最初是UNIX系統上的一個程式,後來又迅速擴充套件到其他操作平臺。SSH在正確使用時可彌補網路中的漏洞。SSH客戶端適用於多種平臺。幾乎所有UNIX平臺—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平臺,都可執行SSH。

實際工作中,我們經常使用客戶端工具(比如:Secure CRT,Xshell,MobaXterm等)SSH到主機上,執行一些操作命令。

如何使用Java語言實現SSH 連線主機,並執行Shell命令呢?

2、Java 實現 SSH命令

1)程式碼實現如下:

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

import org.apache.commons.lang3.StringUtils;

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


public class SshUtil {
 private static String DEFAULT_CHAR_SET = "UTF-8";
 private static String tipStr = "=======================%s=======================";
 private static String splitStr = "=====================================================";
 
 /**
  * 登入主機
  * @return
  *  登入成功返回true,否則返回false
  */
 public static Connection login(String ip,String userName,String password){
  boolean isAuthenticated = false;
  Connection conn = null;
  long startTime = Calendar.getInstance().getTimeInMillis();
  try {
   conn = new Connection(ip);
   conn.connect(); // 連線主機

   isAuthenticated = conn.authenticateWithPassword(userName,password); // 認證
   if(isAuthenticated){
    System.out.println(String.format(tipStr,"認證成功"));
   } else {
    System.out.println(String.format(tipStr,"認證失敗"));
   }
  } catch (IOException e) {
   System.err.println(String.format(tipStr,"登入失敗"));
   e.printStackTrace();
  }
  long endTime = Calendar.getInstance().getTimeInMillis();
  System.out.println("登入用時: " + (endTime - startTime)/1000.0 + "s\n" + splitStr);
  return conn;
 }
 
 /**
  * 遠端執行shell指令碼或者命令
  * @param cmd
  *  即將執行的命令
  * @return
  *  命令執行完後返回的結果值
  */
 public static String execute(Connection conn,String cmd){
  String result = "";
  Session session = null;
  try {
   if(conn != null){
    session = conn.openSession(); // 開啟一個會話
    session.execCommand(cmd);  // 執行命令
    result = processStdout(session.getStdout(),DEFAULT_CHAR_SET);

    //如果為得到標準輸出為空,說明指令碼執行出錯了
    if(StringUtils.isBlank(result)){
     System.err.println("【得到標準輸出為空】\n執行的命令如下:\n" + cmd);
     result = processStdout(session.getStderr(),DEFAULT_CHAR_SET);
    }else{
     System.out.println("【執行命令成功】\n執行的命令如下:\n" + cmd);
    }
   }
  } catch (IOException e) {
   System.err.println("【執行命令失敗】\n執行的命令如下:\n" + cmd + "\n" + e.getMessage());
   e.printStackTrace();
  } finally {
   if (conn != null) {
    conn.close();
   }
   if (session != null) {
    session.close();
   }
  }
  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) {
   System.err.println("解析指令碼出錯:" + e.getMessage());
   e.printStackTrace();
  } catch (IOException e) {
   System.err.println("解析指令碼出錯:" + e.getMessage());
   e.printStackTrace();
  }
  return buffer.toString();
 }

 public static void main(String[] args){
  String ip = "192.168.123.234"; // 此處根據實際情況,換成自己需要訪問的主機IP
  String userName = "root";
  String password = "password";
  Connection conn = SshUtil.login(ip,userName,password);

  String cmd = "cd /home/miracle&&pwd&&ls&&cat luna.txt";
  String result = SshUtil.execute(conn,cmd);
  System.out.println(splitStr + "\n執行的結果如下: \n" + result + splitStr);
 }
}

2)執行結果如下:

=======================認證成功=======================
登入用時: 0.859s
=====================================================
【執行命令成功】
執行的命令如下:
cd /home/miracle&&pwd&&ls&&cat luna.txt
=====================================================
執行的結果如下: 
/home/miracle
luna.txt
Hello,I'm SshUtil.
Nice to meet you.^_^
=====================================================

3)pom.xml 引用新增如下:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.9</version>
  </dependency>

  <!-- ssh -->
  <dependency>
   <groupId>ch.ethz.ganymed</groupId>
   <artifactId>ganymed-ssh2</artifactId>
   <version>262</version>
  </dependency>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。