這篇文章主要介紹了基于Java實(shí)現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
專注于為中小企業(yè)提供做網(wǎng)站、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)欽北免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1、SSH命令
SSH 為 Secure Shell 的縮寫,由 IETF 的網(wǎng)絡(luò)小組(Network Working Group)所制定;SSH 為建立在應(yīng)用層基礎(chǔ)上的安全協(xié)議。SSH 是較可靠,專為遠(yuǎn)程登錄會(huì)話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議。利用 SSH 協(xié)議可以有效防止遠(yuǎn)程管理過程中的信息泄露問題。SSH最初是UNIX系統(tǒng)上的一個(gè)程序,后來又迅速擴(kuò)展到其他操作平臺(tái)。SSH在正確使用時(shí)可彌補(bǔ)網(wǎng)絡(luò)中的漏洞。SSH客戶端適用于多種平臺(tái)。幾乎所有UNIX平臺(tái)—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平臺(tái),都可運(yùn)行SSH。
實(shí)際工作中,我們經(jīng)常使用客戶端工具(比如:Secure CRT,Xshell,MobaXterm等)SSH到主機(jī)上,執(zhí)行一些操作命令。
如何使用Java語言實(shí)現(xiàn)SSH 連接主機(jī),并執(zhí)行Shell命令呢?
2、Java 實(shí)現(xiàn) SSH命令
1)代碼實(shí)現(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.ssh3.Connection; import ch.ethz.ssh3.Session; import ch.ethz.ssh3.StreamGobbler; public class SshUtil { private static String DEFAULT_CHAR_SET = "UTF-8"; private static String tipStr = "=======================%s======================="; private static String splitStr = "====================================================="; /** * 登錄主機(jī) * @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(); // 連接主機(jī) isAuthenticated = conn.authenticateWithPassword(userName, password); // 認(rèn)證 if(isAuthenticated){ System.out.println(String.format(tipStr, "認(rèn)證成功")); } else { System.out.println(String.format(tipStr, "認(rèn)證失敗")); } } catch (IOException e) { System.err.println(String.format(tipStr, "登錄失敗")); e.printStackTrace(); } long endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("登錄用時(shí): " + (endTime - startTime)/1000.0 + "s\n" + splitStr); return conn; } /** * 遠(yuǎn)程執(zhí)行shell腳本或者命令 * @param cmd * 即將執(zhí)行的命令 * @return * 命令執(zhí)行完后返回的結(jié)果值 */ public static String execute(Connection conn, String cmd){ String result = ""; Session session = null; try { if(conn != null){ session = conn.openSession(); // 打開一個(gè)會(huì)話 session.execCommand(cmd); // 執(zhí)行命令 result = processStdout(session.getStdout(), DEFAULT_CHAR_SET); //如果為得到標(biāo)準(zhǔn)輸出為空,說明腳本執(zhí)行出錯(cuò)了 if(StringUtils.isBlank(result)){ System.err.println("【得到標(biāo)準(zhǔn)輸出為空】\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í)行返回的結(jié)果集 * @param in 輸入流對(duì)象 * @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("解析腳本出錯(cuò):" + e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.err.println("解析腳本出錯(cuò):" + e.getMessage()); e.printStackTrace(); } return buffer.toString(); } public static void main(String[] args){ String ip = "192.168.123.234"; // 此處根據(jù)實(shí)際情況,換成自己需要訪問的主機(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í)行的結(jié)果如下: \n" + result + splitStr); } }
2)運(yùn)行結(jié)果如下:
=======================認(rèn)證成功======================= 登錄用時(shí): 0.859s ===================================================== 【執(zhí)行命令成功】 執(zhí)行的命令如下: cd /home/miracle&&pwd&&ls&&cat luna.txt ===================================================== 執(zhí)行的結(jié)果如下: /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-ssh3</artifactId> <version>262</version> </dependency>
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
文章名稱:基于Java實(shí)現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過程解析
網(wǎng)站鏈接:http://jinyejixie.com/article10/gpgsgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站策劃、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)