使用Java管理千台规模Linux服务器_入门
作者:网络转载 发布时间:[ 2012/7/19 10:13:46 ] 推荐标签:
前东家是一家游戏公司,老板很好,当时工作也留下了很多自己原创的管理脚本。现在分享一下在办公环境使用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);
}
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11