mysqlworkbench与ssh通过密钥连服务器

mysql workbench:


用命令ssh,打开一个端口:

ssh -p ssh目标端口 -i ~/秘钥文件  ssh用户名@ssh目标主机 -L 0.0.0.0:本地端口号:堡垒机IP:堡垒机端口

例:

ssh -p 30012 -i ~/aliyun_rsa  user@139.14.14.16 -L 0.0.0.0:10010:192.168.0.101:3306

然后连数据库,用java连本地的10010端口即可。



而如果是通过ssh的用户名密码方式连堡垒机,再连数据库,可以用jsch连接:

pom.xml

<dependency>
   <groupId>com.jcraft</groupId>
   <artifactId>jsch</artifactId>
   <version>0.1.55</version>
</dependency>


配置文件:

#本地端口(就是本地访问这个端口,会被转发到所配置的数据库服务器)
lport=10010


#SSH服务器ip
host=xx.xx.xx.xx
#SSH访问端口
port=xxxx
#SSH连接用户名
user=root
#SSH连接密码
password=xxxx

# 远程数据库服务器(是数据库的! 注意数据库的账号密码不需要在这里指定,在jdbc里指定或springboot里配置)
rhost=localhost
#远程数据库服务端口
rport=3306


main入口函数:

public static void main(String args[]) throws Exception {
	SSHService.sshRun();
    System.out.println(new Gson().toJson(selectLastInfo()));
}
其中selectLastInfo就是正常的数据库访问service方法。

SSHService类:

package net.highersoft.jdbcssh;


import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * SSH端口转发
 */
public class SSHService {
    static Integer lport;//本地端口
    static String rhost;//远程数据库服务器
    static int rport;//远程数据库服务端口

    static String user;//SSH连接用户名
    static String password;//SSH连接密码
    static String pem_file_path;//SSH连接密码
    static String host;//SSH服务器
    static int port;//SSH访问端口

    static {
        //读取配置文件
        try {
            // 获取SSH.properties文件的路径
            InputStream is = SSHService.class.getClassLoader().getResourceAsStream("SSH.properties");
            Properties prop = new Properties();
            prop.load(is);
            // 读取配置文件的值
            lport = Integer.valueOf(prop.getProperty("lport"));
            rhost = prop.getProperty("rhost");
            rport = Integer.valueOf(prop.getProperty("rport"));
            user = prop.getProperty("user");
            password = prop.getProperty("password");
            pem_file_path = prop.getProperty("pem_file_path");
            host = prop.getProperty("host");
            port = Integer.valueOf(prop.getProperty("port"));

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void sshRun() {
        JSch jsch = new JSch();
        Session session = null;
        try {
            if (pem_file_path != null) {
                jsch.addIdentity(pem_file_path);
            }
            session = jsch.getSession(user, host, port);

            if (pem_file_path == null) {
                session.setPassword(password);
            }

            session.setConfig("StrictHostKeyChecking", "no");
            // step1:建立ssh连接
            session.connect();
            System.out.println(session.getServerVersion());//这里打印SSH服务器版本信息
            //step2: 设置SSH本地端口转发,本地转发到远程
            int assinged_port = session.setPortForwardingL(lport, rhost, rport);
            System.out.println("localhost:" + assinged_port + " -> " + rhost + ":" + rport);
        } catch (Exception e) {
            if (null != session) {
                //关闭ssh连接
                session.disconnect();
            }
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        sshRun();
    }

}



文/程忠 浏览次数:0次   2023-10-07 15:55:15

相关阅读


评论:
点击刷新

↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑