Java如何通過ssh遠(yuǎn)程連接主機(jī)并執(zhí)行命令
Java通過ssh遠(yuǎn)程連接主機(jī)并執(zhí)行命令
需要用到的jar包:
主體代碼:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import org.apache.commons.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"; /** * 登錄主機(jī) * @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);//認(rèn)證 if(flg){ log.info("=========登錄成功========="+conn); return conn; } } catch (IOException e) { log.error("=========登錄失敗========="+e.getMessage()); e.printStackTrace(); } return conn; } /** * 遠(yuǎn)程執(zhí)行shll腳本或者命令 * @param cmd * 即將執(zhí)行的命令 * @return * 命令執(zhí)行完后返回的結(jié)果值 */ public static String execute(Connection conn,String cmd){ String result=""; try { if(conn !=null){ Session session= conn.openSession();//打開一個(gè)會話 session.execCommand(cmd);//執(zhí)行命令 result=processStdout(session.getStdout(),DEFAULTCHART); //如果為得到標(biāo)準(zhǔn)輸出為空,說明腳本執(zhí)行出錯了 if(StringUtils.isBlank(result)){ log.info("得到標(biāo)準(zhǔn)輸出為空,鏈接conn:"+conn+",執(zhí)行的命令:"+cmd); result=processStdout(session.getStderr(),DEFAULTCHART); }else{ log.info("執(zhí)行命令成功,鏈接conn:"+conn+",執(zhí)行的命令:"+cmd); } conn.close(); session.close(); } } catch (IOException e) { log.info("執(zhí)行命令失敗,鏈接conn:"+conn+",執(zhí)行的命令:"+cmd+" "+e.getMessage()); e.printStackTrace(); } return result; } /** * 解析腳本執(zhí)行返回的結(jié)果集 * @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這個(gè)jar包,每次只能執(zhí)行一條命令,如果一條命令執(zhí)行了沒有關(guān)閉,再去執(zhí)行第二條則會throw new IOException("A remote execution has already started.");
若希望同時(shí)執(zhí)行多條命令,可以在傳入的cmd字符串中用&&連接多條命令。
如:
那么多條命令執(zhí)行的所有結(jié)果將會一同作為返回的字符串。
ssh 遠(yuǎn)程腳本執(zhí)行 java: command not found
ssh 遠(yuǎn)程主機(jī)腳本執(zhí)行、執(zhí)行 java -version,報(bào)如題錯誤
[root@doris-fe-01 module]# ./install.sh "java -version "
java -version
doris-fe-01 ...
bash: java: command not found
doris-fe-02 ...
bash: java: command not found### 直接登錄遠(yuǎn)程主機(jī),java -version 正常執(zhí)行
[root@doris-fe-01 module]# ssh doris-fe-02
Last login: Mon Nov 14 16:54:51 2022
[root@doris-fe-02 ~]# java -version
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
處理
export JAVA_HOME=/opt/module/jdk1.8.0_141' >>/etc/bashrc echo 'export PATH=/opt/module/jdk1.8.0_141/bin:$PATH' >>/etc/bashrc ###? source /etc/bashrc
[root@doris-fe-01 module]# ./install.sh "java -version "
java -version
doris-fe-01 ...
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
...
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot動態(tài)數(shù)據(jù)源連接測試的操作詳解
這篇文章主要介紹了SpringBoot動態(tài)數(shù)據(jù)源連接測試的操作步驟,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03Spring中的策略模式簡單實(shí)現(xiàn)與使用分析
這篇文章主要介紹了Spring中的策略模式簡單實(shí)現(xiàn)與使用分析,去初始化時(shí)除了?initMultipartResolver(上傳文件)沒有獲取?Properties?defaultStrategies;默認(rèn)策略,其他的八大件都會使用到策略模式,需要的朋友可以參考下2024-01-01Springcloud GateWay網(wǎng)關(guān)配置過程圖解
這篇文章主要介紹了Springcloud GateWay網(wǎng)關(guān)配置過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例
本文主要介紹了spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08maven+阿里云創(chuàng)建國內(nèi)鏡像的中央倉庫(親測可用)
本篇文章主要介紹了maven+阿里云創(chuàng)建國內(nèi)鏡像的中央倉庫(親測可用),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12