前東家是一家遊戲公司,老闆很好,當時工作也留下了很多自己原創的管理腳本。現在分享一下在辦公環境使用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);
- }
- }
- }
原文鏈接:http://www.oschina.net/code/snippet_222919_11734
[火星人 ] 使用Java管理千台規模Linux伺服器_入門已經有469次圍觀