使用Java管理千臺規模Linux服務器_入門
前東家是一家游戲公司,老板很好,當時工作也留下了很多自己原創的管理腳本。現在分享一下在辦公環境使用Java、Jsch登錄VPN管理Linux的腳本(此處實現JAVA調用Linux上備份Mysql的shell作為示例),希望對運維的朋友有幫助,盡快從繁雜的服務器管理工作中脫離出來。
主要的實現思路:
如果需要先登錄VPN才能連接游戲服務器,需要將游戲服務器的ssh端口(一般是22)映射到本地辦公電腦的端口上(如5555),然后ssh連接本地辦公電腦的5555端口,這樣就可以連接到游戲服務器,并可以管理游戲服務器了。
當您學會通過VPN連接Linux服務器后,如果只在內網環境,不使用VPN,就更簡單了,此外不再詳述。Jsch的example里也有介紹。
代碼:使用Jsch透過VPN
- package com.daily.wednesday;
- import java.io.IOException;
- import java.io.InputStream;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import com.daily.util.DataBaseConnection;
- import com.jcraft.jsch.Channel;
- import com.jcraft.jsch.ChannelExec;
- import com.jcraft.jsch.JSch;
- import com.jcraft.jsch.JSchException;
- import com.jcraft.jsch.Session;
- public class BackUpMysql3 {
- public static void main(String args[]) {
- // 讀取數據庫配置
- DataBaseConnection dataBaseConnection = new DataBaseConnection();
- String dataBaseConfigForWrite[] = new String[3];
- dataBaseConfigForWrite = dataBaseConnection.loadDataConfig();
- Connection conn = null;// 數據庫連接
- Statement stmt = null;// 數據庫表達式
- ResultSet rs = null; // 結果集
- int rowcount = 0;// 總記錄數
- String sql = "select * from servers_maint_wednesday";
- try {
- conn = DriverManager.getConnection(dataBaseConfigForWrite[0],
- dataBaseConfigForWrite[1], dataBaseConfigForWrite[2]);
- stmt = conn.createStatement();
- rs = stmt.executeQuery(sql);
- rs.last();
- rowcount = rs.getRow();// 總記錄數
- rs = stmt.executeQuery(sql);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- // 定義游戲服務器IP的數組,游戲服務器IP存在數據庫中。
- String privateIpaddress[] = new String[rowcount];
- String remark[] = new String[rowcount];// 定義游戲區名稱
- String programPath[] = new String[rowcount];// 定義程序路徑
- String backMysqlShellPath[] = new String[rowcount];// 定義mysql備份腳本路徑
- int j = 0;
- try {
- while (rs.next()) {
- privateIpaddress[j] = rs.getString("privateipaddress");
- remark[j] = rs.getString("remarks");
- programPath[j] = rs.getString("programpath");
- backMysqlShellPath[j] = rs.getString("backmysqlshellpath");
- j++;
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (rs != null) {
- rs.close();
- }
- if (stmt != null) {
- stmt.close();
- }
- if (conn != null) {
- conn.close();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- // 調用mysql備份方法
- for (int n = 0; n < privateIpaddress.length; n++) {
- try {
- try {
- backUpMysql(privateIpaddress[n], backMysqlShellPath[n],remark[n]);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } catch (JSchException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- /**
- * 備份mysql數據庫的方法
- * @param privateip
- * @param backMysqlShellPath
- * @throws JSchException
- * @throws IOException
- */
- public static void backUpMysql(String privateip, String backMysqlShellPath, String remark)
- throws JSchException, IOException {
- // 登錄到服務器
- int rport;
- JSch jsch = new JSch();
- String host = "dl.dengdie.com"; //此處為VPN服務器地址
- String user = "admin"; //VPN用戶名
- Session sessionForBack = jsch.getSession(user, host, 22);
- rport = 22;
- sessionForBack.setPassword("&*&&&&lalaflls"); //VPN密碼
- java.util.Properties config = new java.util.Properties();
- config.put("StrictHostKeyChecking", "no");
- sessionForBack.setConfig(config);
- sessionForBack.connect();//登錄到VPN服務器
-
- // 建立與游戲服務器的ssh轉發連接:即將游戲服務器的22號ssh端口映射的本地辦公電腦的53238端口。
- sessionForBack.setPortForwardingL(53238, privateip, rport);
- try {
- JSch jschToBack = new JSch();
- Session sessionToBack = jschToBack.getSession(user, "127.0.0.1",
- 53238); //連接本地辦公電腦的53238端口,就相當于連接了游戲服務器的22號端口。
- sessionToBack.setPassword("&*&&&&lalaflls");
- sessionToBack.setConfig(config);
- sessionToBack.connect();
- //backMysqlShellPath實際上是游戲服務器上備份Mysql數據庫的一個腳本,此腳本請您自行實現,網上很多實例。
- String command = backMysqlShellPath;
- //打開執行命令的隧道,并執行命令。
- Channel channel = sessionToBack.openChannel("exec");
- ((ChannelExec) channel).setCommand(command);
- channel.setInputStream(null);
- ((ChannelExec) channel).setErrStream(System.err);
- InputStream in = channel.getInputStream();
- channel.connect();
- byte[] tmp = new byte[1024];
- while (true) {
- while (in.available() > 0) {
- int i = in.read(tmp, 0, 1024);
- if (i < 0)
- break;
- System.out.print(new String(tmp, 0, i));
- }
- if (channel.isClosed()) {
- System.out.println(remark + "Mysql備份完畢!");
- System.out.println("exit-status: "
- + channel.getExitStatus());
- break;
- }
- try {
- Thread.sleep(1000);
- } catch (Exception ee) {
- }
- }
- channel.disconnect();
- sessionToBack.disconnect();
- sessionForBack.disconnect();
- } catch (Exception e) {
- System.out.println(e);
- }
- }
- }
前東家是一家游戲公司,老板很好,當時工作也留下了很多自己原創的管理腳本。現在分享一下在辦公環境使用Java、Jsch登錄VPN管理Linux的腳本(此處實現JAVA調用Linux上備份Mysql的shell作為示例),希望對運維的朋友有幫助,盡快從繁雜的服務器管理工作中脫離出來。
主要的實現思路:
如果需要先登錄VPN才能連接游戲服務器,需要將游戲服務器的ssh端口(一般是22)映射到本地辦公電腦的端口上(如5555),然后ssh連接本地辦公電腦的5555端口,這樣就可以連接到游戲服務器,并可以管理游戲服務器了。
當您學會通過VPN連接Linux服務器后,如果只在內網環境,不使用VPN,就更簡單了,此外不再詳述。Jsch的example里也有介紹。
代碼:使用Jsch透過VPN
|
posted on 2012-07-20 09:39 順其自然EVO 閱讀(247) 評論(0) 編輯 收藏 所屬分類: 數據庫