基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析
這篇文章主要介紹了基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
1、SSH命令
SSH 為 Secure Shell 的縮寫,由 IETF 的網(wǎng)絡小組(Network Working Group)所制定;SSH 為建立在應用層基礎上的安全協(xié)議。SSH 是較可靠,專為遠程登錄會話和其他網(wǎng)絡服務提供安全性的協(xié)議。利用 SSH 協(xié)議可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統(tǒng)上的一個程序,后來又迅速擴展到其他操作平臺。SSH在正確使用時可彌補網(wǎng)絡中的漏洞。SSH客戶端適用于多種平臺。幾乎所有UNIX平臺—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平臺,都可運行SSH。
實際工作中,我們經(jīng)常使用客戶端工具(比如:Secure CRT,Xshell,MobaXterm等)SSH到主機上,執(zhí)行一些操作命令。
如何使用Java語言實現(xiàn)SSH 連接主機,并執(zhí)行Shell命令呢?
2、Java 實現(xiàn) SSH命令
1)代碼實現(xiàn)如下:
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;
}
/**
* 遠程執(zhí)行shell腳本或者命令
* @param cmd
* 即將執(zhí)行的命令
* @return
* 命令執(zhí)行完后返回的結果值
*/
public static String execute(Connection conn, String cmd){
String result = "";
Session session = null;
try {
if(conn != null){
session = conn.openSession(); // 打開一個會話
session.execCommand(cmd); // 執(zhí)行命令
result = processStdout(session.getStdout(), DEFAULT_CHAR_SET);
//如果為得到標準輸出為空,說明腳本執(zhí)行出錯了
if(StringUtils.isBlank(result)){
System.err.println("【得到標準輸出為空】\n執(zhí)行的命令如下:\n" + cmd);
result = processStdout(session.getStderr(), DEFAULT_CHAR_SET);
}else{
System.out.println("【執(zhí)行命令成功】\n執(zhí)行的命令如下:\n" + cmd);
}
}
} catch (IOException e) {
System.err.println("【執(zhí)行命令失敗】\n執(zhí)行的命令如下:\n" + cmd + "\n" + e.getMessage());
e.printStackTrace();
} finally {
if (conn != null) {
conn.close();
}
if (session != null) {
session.close();
}
}
return result;
}
/**
* 解析腳本執(zhí)行返回的結果集
* @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"; // 此處根據(jù)實際情況,換成自己需要訪問的主機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執(zhí)行的結果如下: \n" + result + splitStr);
}
}
2)運行結果如下:
=======================認證成功======================= 登錄用時: 0.859s ===================================================== 【執(zhí)行命令成功】 執(zhí)行的命令如下: cd /home/miracle&&pwd&&ls&&cat luna.txt ===================================================== 執(zhí)行的結果如下: /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>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
使用Maven 搭建 Spring MVC 本地部署Tomcat的詳細教程
Spring Security源碼解析之權限訪問控制是如何做到的

