qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          使用Java管理千臺規模Linux服務器_入門

          前東家是一家游戲公司,老板很好,當時工作也留下了很多自己原創的管理腳本。現在分享一下在辦公環境使用Java、Jsch登錄VPN管理Linux的腳本(此處實現JAVA調用Linux上備份Mysql的shell作為示例),希望對運維的朋友有幫助,盡快從繁雜的服務器管理工作中脫離出來。

            主要的實現思路:

            如果需要先登錄VPN才能連接游戲服務器,需要將游戲服務器的ssh端口(一般是22)映射到本地辦公電腦的端口上(如5555),然后ssh連接本地辦公電腦的5555端口,這樣就可以連接到游戲服務器,并可以管理游戲服務器了。

            當您學會通過VPN連接Linux服務器后,如果只在內網環境,不使用VPN,就更簡單了,此外不再詳述。Jsch的example里也有介紹。

            代碼:使用Jsch透過VPN

          1. package com.daily.wednesday;  
          2. import java.io.IOException;  
          3. import java.io.InputStream;  
          4. import java.sql.Connection;  
          5. import java.sql.DriverManager;  
          6. import java.sql.ResultSet;  
          7. import java.sql.SQLException;  
          8. import java.sql.Statement;  
          9. import com.daily.util.DataBaseConnection;  
          10. import com.jcraft.jsch.Channel;  
          11. import com.jcraft.jsch.ChannelExec;  
          12. import com.jcraft.jsch.JSch;  
          13. import com.jcraft.jsch.JSchException;  
          14. import com.jcraft.jsch.Session;  
          15. public class BackUpMysql3 {  
          16.     public static void main(String args[]) {  
          17.         // 讀取數據庫配置 
          18.         DataBaseConnection dataBaseConnection = new DataBaseConnection();  
          19.         String dataBaseConfigForWrite[] = new String[3];  
          20.         dataBaseConfigForWrite = dataBaseConnection.loadDataConfig();  
          21.         Connection conn = null;// 數據庫連接 
          22.         Statement stmt = null;// 數據庫表達式 
          23.         ResultSet rs = null// 結果集 
          24.         int rowcount = 0;// 總記錄數 
          25.         String sql = "select * from servers_maint_wednesday";  
          26.         try {  
          27.             conn = DriverManager.getConnection(dataBaseConfigForWrite[0],  
          28.                     dataBaseConfigForWrite[1], dataBaseConfigForWrite[2]);  
          29.             stmt = conn.createStatement();  
          30.             rs = stmt.executeQuery(sql);  
          31.             rs.last();  
          32.             rowcount = rs.getRow();// 總記錄數 
          33.             rs = stmt.executeQuery(sql);  
          34.         } catch (SQLException e) {  
          35.             e.printStackTrace();  
          36.         }  
          37.         // 定義游戲服務器IP的數組,游戲服務器IP存在數據庫中。 
          38.         String privateIpaddress[] = new String[rowcount];  
          39.         String remark[] = new String[rowcount];// 定義游戲區名稱 
          40.         String programPath[] = new String[rowcount];// 定義程序路徑 
          41.         String backMysqlShellPath[] = new String[rowcount];// 定義mysql備份腳本路徑 
          42.         int j = 0;  
          43.         try {  
          44.             while (rs.next()) {  
          45.                 privateIpaddress[j] = rs.getString("privateipaddress");  
          46.                 remark[j] = rs.getString("remarks");  
          47.                 programPath[j] = rs.getString("programpath");  
          48.                 backMysqlShellPath[j] = rs.getString("backmysqlshellpath");  
          49.                 j++;  
          50.             }  
          51.         } catch (Exception e) {  
          52.             e.printStackTrace();  
          53.         } finally {  
          54.             try {  
          55.                 if (rs != null) {  
          56.                     rs.close();  
          57.                 }  
          58.                 if (stmt != null) {  
          59.                     stmt.close();  
          60.                 }  
          61.                 if (conn != null) {  
          62.                     conn.close();  
          63.                 }  
          64.             } catch (Exception e) {  
          65.                 e.printStackTrace();  
          66.             }  
          67.         }  
          68.         // 調用mysql備份方法 
          69.         for (int n = 0; n < privateIpaddress.length; n++) {  
          70.             try {  
          71.                 try {  
          72.                     backUpMysql(privateIpaddress[n], backMysqlShellPath[n],remark[n]);  
          73.                 } catch (IOException e) {  
          74.                     // TODO Auto-generated catch block 
          75.                     e.printStackTrace();  
          76.                 }  
          77.             } catch (JSchException e) {  
          78.                 // TODO Auto-generated catch block 
          79.                 e.printStackTrace();  
          80.             }  
          81.         }  
          82.     }  
          83.     /** 
          84.      * 備份mysql數據庫的方法 
          85.      * @param privateip 
          86.      * @param backMysqlShellPath 
          87.      * @throws JSchException 
          88.      * @throws IOException 
          89.      */ 
          90.     public static void backUpMysql(String privateip, String backMysqlShellPath, String remark)  
          91.             throws JSchException, IOException {  
          92.         // 登錄到服務器 
          93.         int rport;  
          94.         JSch jsch = new JSch();  
          95.         String host = "dl.dengdie.com"//此處為VPN服務器地址 
          96.         String user = "admin"//VPN用戶名 
          97.         Session sessionForBack = jsch.getSession(user, host, 22);  
          98.         rport = 22;  
          99.         sessionForBack.setPassword("&*&&&&lalaflls"); //VPN密碼 
          100.         java.util.Properties config = new java.util.Properties();  
          101.         config.put("StrictHostKeyChecking""no");  
          102.         sessionForBack.setConfig(config);  
          103.         sessionForBack.connect();//登錄到VPN服務器 
          104.           
          105.         // 建立與游戲服務器的ssh轉發連接:即將游戲服務器的22號ssh端口映射的本地辦公電腦的53238端口。       
          106.         sessionForBack.setPortForwardingL(53238, privateip, rport);  
          107.         try {  
          108.             JSch jschToBack = new JSch();  
          109.             Session sessionToBack = jschToBack.getSession(user, "127.0.0.1",  
          110.                     53238); //連接本地辦公電腦的53238端口,就相當于連接了游戲服務器的22號端口。 
          111.             sessionToBack.setPassword("&*&&&&lalaflls");  
          112.             sessionToBack.setConfig(config);  
          113.             sessionToBack.connect();  
          114.             //backMysqlShellPath實際上是游戲服務器上備份Mysql數據庫的一個腳本,此腳本請您自行實現,網上很多實例。 
          115.             String command = backMysqlShellPath;  
          116.             //打開執行命令的隧道,并執行命令。 
          117.             Channel channel = sessionToBack.openChannel("exec");  
          118.             ((ChannelExec) channel).setCommand(command);  
          119.             channel.setInputStream(null);  
          120.             ((ChannelExec) channel).setErrStream(System.err);  
          121.             InputStream in = channel.getInputStream();  
          122.             channel.connect();  
          123.             byte[] tmp = new byte[1024];  
          124.             while (true) {  
          125.                 while (in.available() > 0) {  
          126.                     int i = in.read(tmp, 01024);  
          127.                     if (i < 0)  
          128.                         break;  
          129.                     System.out.print(new String(tmp, 0, i));  
          130.                 }  
          131.                 if (channel.isClosed()) {  
          132.                     System.out.println(remark + "Mysql備份完畢!");  
          133.                     System.out.println("exit-status: " 
          134.                             + channel.getExitStatus());  
          135.                     break;  
          136.                 }  
          137.                 try {  
          138.                     Thread.sleep(1000);  
          139.                 } catch (Exception ee) {  
          140.                 }  
          141.             }  
          142.             channel.disconnect();  
          143.             sessionToBack.disconnect();  
          144.             sessionForBack.disconnect();  
          145.         } catch (Exception e) {  
          146.             System.out.println(e);  
          147.         }  
          148.     }  
          149. }

          posted on 2012-07-20 09:39 順其自然EVO 閱讀(247) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2012年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 明水县| 永和县| 青州市| 大渡口区| 当阳市| 凤台县| 舞阳县| 澳门| 昌宁县| 南漳县| 那曲县| 巨鹿县| 义乌市| 乐清市| 清丰县| 嵊州市| 澳门| 县级市| 淮阳县| 全南县| 东宁县| 探索| 黔江区| 饶河县| 金塔县| 常宁市| 喀喇| 平顶山市| 顺平县| 新密市| 宁陕县| 奉化市| 防城港市| 丹东市| 卢氏县| 肥东县| 铁岭市| 武夷山市| 崇州市| 惠州市| 南丹县|