http://www.oschina.net/code/snippet_222919_11734

代码分享

当前位置:
代码分享 » Java  » 网络编程

搜 索

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

主要的实现思路:

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

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

 
标签: CentOS JSch
 

代码片段(1)[全屏查看所有代码]

1. [代码]使用Jsch透过VPN     跳至 [1] [全屏预览]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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管理千台规模Linux服务器_入门的更多相关文章

  1. java技术用ssh从linux服务器下载数据

    通常需要从linux服务器获取数据文件,而通常能有的访问方式只有ssh,所以就可以用ssh进行数据下载. java连接远程主机的方式有多种,这里和大家分享的是通过ssh方式连接远程主机,使用的是jsc ...

  2. 设置多台机器linux服务器ssh相互无密码访问

    在每台服务器上都执行ssh-keygen -t rsa生成密钥对: $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter ...

  3. Java项目使用 Tomcat 部署 Linux 服务器

    一.安装 Java 环境 1 下载 jdk 8 yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 设置 centos7 环境变量 v ...

  4. java使用JSCH连接FTP(Linux服务器)上传文件到Linux服务器

    首先需要用到jsch-0.1.54.jar 包: 链接: https://pan.baidu.com/s/1kZR6MqwpCYht9Pp_D6NKQw 密码: gywx 直接上代码: package ...

  5. 搭建腾讯云Linux服务器(Centos6)入门教程

    搭建腾讯云我们需要准备WinSCP,支持文件上传和下载的客户端,界面操作,很方便快捷,有这个可以不用搭建SVN哦! SecureCRT 7.3,这个是很不错的Linux远程客户端哦,可以去CSDN下载 ...

  6. Linux指令_入门基础

    一.基础指令语法 1.ls指令: 用法1:#ls 含义:列出当前工作目录下的所有文件/文件夹的名称. 用法2:#ls 路径 含义:列出指定路径下的所有文件/文件夹的名称 用法3:#ls 选项 路径 含 ...

  7. TOP100summit 2017:微博如何做到1小时增加一千台服务器应对鹿晗恋情带来的流量暴增

    10月8日中午12点,鹿晗和关晓彤宣布恋情,年近30的我并不关心小鲜肉们的分分合合,但是作为壹佰案例这个软件研发行业自媒体的小编,我更关注因此引发的微博宕机事件. 鹿晗公布恋情的微博获得462884次 ...

  8. 【随笔】Linux服务器备份相关

    服务器数据的安全性一直都是服务器日常管理的重中之重.Linux服务器虚拟化虽然以其高度可靠的作业系统而闻名,不过系统失效仍然可能发生.可能因为硬体故障,电源中断,或其他不可预料的问题.更常见的这 些问 ...

  9. [问题解决] 程序部署到Linux服务器乱码

    错误: 在windows下开发的eclipse项目需要用java mail发送邮件,在将整个项目部署到linux服务器之后发送的邮件出现了乱码. 发生场景: Linux服务器下的Java mail程序 ...

随机推荐

  1. mysql字符集问题

    背景:数据库表信息乱码问题 影响:数据库连接初始化中断 原因:init_connect参数设置问题,参数为不可执行语句. 1.1 DB字符集参数 #数据库中的字符集设置(以下全部为修改过后的结果) m ...

  2. Ubuntu cron定时执行任务

    1.添加自定义事件 crontab -e 2.选定编辑器 3.添加执行代码 * * * * /usr/bin/curl http://www.exmple.com/cron.php crontab 命 ...

  3. QTP脚本程序(原创自编)

    '编写哨位台程序测试脚本,实现功能如下:'1.自动添加100条查哨换岗人员记录,'2.自动添加美电.海康,大华视频.'3.自动配置视频设备.'4.检查后台进程是否存在.'5.视频轮巡.'####### ...

  4. html/css技巧总结

    .e-select .on{display:none} on为e-select的子元素,(之间有空格).e-select.on{display:block} 只有两种属性同时存在时才会起作用(之间无空 ...

  5. LeetCode OJ 257. Binary Tree Paths

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  6. 运行出第一个程序Hello World、第二个程序网页浏览器

    很长时间没有发博客记录我的奋斗历程了,原因不外乎遇到了对我而言“巨大的”困难. 经历了长期的找不到合适的教材.找不到Xcode资源.运行不出例程的痛苦以后,近日终于走上正轨. 现在补发一个过去2个月来 ...

  7. oc知道经纬度求位置

    CLLocation *newLocation = [locations lastObject]; CLGeocodeCompletionHandler handler = ^(NSArray *pl ...

  8. 访问nginx-php页面的时候 报access denied.

    访问页面的时候出现这个时access denied 只需到/usr/local/php/etc/php.ini中修改一下 把这个注释掉 ;open_basedir =  把这个值赋值为1  cgi.f ...

  9. PHP文件相关函数试题

    一.问答题 1.返回路径中的文件名部分的函数是什么? 2.改变文件模式的函数是什么? 3.拷贝文件的函数是什么? 4.返回路径中的目录部分的函数是什么? 5.将上传的文件移动到指定位置的函数是? 6. ...

  10. 关于PHP静态方法调用和实例化类调用的区别

    1.首先来澄清一些观点 由于静态方法在内存中只有一份,无论你调用多少次,都是共用的,而且没有对象的概念,所以不能在静态方法里面使用$this调用,如果非得调用的话,只能实例化自身类 而实例化不一样,每 ...