当前位置:Gxlcms > PHP教程 > [饶过]使用Java管理千台规模Linux服务器_入门

[饶过]使用Java管理千台规模Linux服务器_入门

时间:2021-07-01 10:21:17 帮助过:23人阅读

前东家是一家游戏公司,老板很好,当时工作也留下了很多自己原创的管理脚本。现在分享一下在办公环境使用Java、Jsch登录VPN管理Linux的脚本(此处实现JAVA调用Linux上备份Mysql的shell作为示例),希望对运维的朋友有帮助,尽快从繁杂的服务器管理工作中脱离出来。

主要的实现思路:

如果需要先登录VPN才能连接游戏服务器,需要将游戏服务器的ssh端口(一般是22)映射到本地办公电脑的端口上(如5555),然后ssh连接本地办公电脑的5555端口,这样就可以连接到游戏服务器,并可以管理游戏服务器了。

当您学会通过VPN连接Linux服务器后,如果只在内网环境,不使用VPN,就更简单了,此外不再详述。Jsch的example里也有介绍。

  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. // 建立与游戏服务器的ssh转发连接:即将游戏服务器的22号ssh端口映射的本地办公电脑的53238端口。
  105. sessionForBack.setPortForwardingL(53238, privateip, rport);
  106. try {
  107. JSch jschToBack = new JSch();
  108. Session sessionToBack = jschToBack.getSession(user, "127.0.0.1",
  109. 53238); //连接本地办公电脑的53238端口,就相当于连接了游戏服务器的22号端口。
  110. sessionToBack.setPassword("&*&&&&lalaflls");
  111. sessionToBack.setConfig(config);
  112. sessionToBack.connect();
  113. //backMysqlShellPath实际上是游戏服务器上备份Mysql数据库的一个脚本,此脚本请您自行实现,网上很多实例。
  114. String command = backMysqlShellPath;
  115. //打开执行命令的隧道,并执行命令。
  116. Channel channel = sessionToBack.openChannel("exec");
  117. ((ChannelExec) channel).setCommand(command);
  118. channel.setInputStream(null);
  119. ((ChannelExec) channel).setErrStream(System.err);
  120. InputStream in = channel.getInputStream();
  121. channel.connect();
  122. byte[] tmp = new byte[1024];
  123. while (true) {
  124. while (in.available() > 0) {
  125. int i = in.read(tmp, 0, 1024);
  126. if (i < 0)
  127. break;
  128. System.out.print(new String(tmp, 0, i));
  129. }
  130. if (channel.isClosed()) {
  131. System.out.println(remark + "Mysql备份完毕!");
  132. System.out.println("exit-status: "
  133. + channel.getExitStatus());
  134. break;
  135. }
  136. try {
  137. Thread.sleep(1000);
  138. } catch (Exception ee) {
  139. }
  140. }
  141. channel.disconnect();
  142. sessionToBack.disconnect();
  143. sessionForBack.disconnect();
  144. } catch (Exception e) {
  145. System.out.println(e);
  146. }
  147. }
  148. }

人气教程排行