Javascript 在节点MySQL中使用SSH隧道连接到MySQL

Javascript 在节点MySQL中使用SSH隧道连接到MySQL,javascript,mysql,node.js,npm,Javascript,Mysql,Node.js,Npm,当使用npm包时,是否可以使用SSH密钥而不是密码连接到MySQL服务器?您可以完全独立地完成SSH隧道组件,然后使用TCP隧道通过SSH将节点MySQL(或任何其他sql客户端…)指向您的数据库 只需像这样设置SSH隧道 ssh -N -p 22 sqluser@remoteserverrunningmysql.your.net -L 33306:localhost:3306 将其保留在背景中(有关更深入的信息,请参阅) 然后只需将任何MySQL客户端发送到本地主机上的端口33306。它将实

当使用npm包时,是否可以使用SSH密钥而不是密码连接到MySQL服务器?

您可以完全独立地完成SSH隧道组件,然后使用TCP隧道通过SSH将节点MySQL(或任何其他sql客户端…)指向您的数据库

只需像这样设置SSH隧道

ssh -N -p 22 sqluser@remoteserverrunningmysql.your.net -L 33306:localhost:3306
将其保留在背景中(有关更深入的信息,请参阅)


然后只需将任何MySQL客户端发送到本地主机上的端口33306。它将实际连接,就像您在远程服务器上使用端口3306一样。

非常感谢Steve,您的回答对我帮助很大。只是为了更清楚地使用它

ssh-fuser@personal-server.com-l2000:personalserver.com:25-N

f告诉ssh在执行命令之前进入后台。然后是您登录的用户名和服务器。-L2000:personal server.com:25的格式为-L本地端口:主机:远程端口。最后,-N指示OpenSSH不要在远程系统上执行命令

要连接到mongo,请使用您设置为本地端口的任何端口(在本例中,端口为2000)

例如,假设我想在IP为192.168.0.100的远程服务器上连接,并且mongo正在端口27017上运行

假设一个名为elie且密码为eliepassword的用户可以访问端口22上的ssh,我将不得不这样做 首先在终端上运行以下操作:

ssh-felie@192.168.0.100-L 2002:127.0.0.1:27017-N

在我的mongo连接中,我将执行以下操作:

var mongoose=require('mongoose')

猫鼬mongodb://localhost:2002/mydatabase');

module.exports=mongoose.connection


我希望这能说明问题。

这确实有效!确保连接始终运行的最佳方法是什么?我不确定最佳方法是什么,但可能只是一个开始。
const mysql = require('mysql2');
const { Client } = require('ssh2');
const sshClient = new Client();
const dbServer = {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE
}
const tunnelConfig = {
    host: process.env.DB_SSH_HOST,
    port: 22,
    username: process.env.DB_SSH_USER,
    password: process.env.DB_SSH_PASSWORD
}
const forwardConfig = {
    srcHost: '127.0.0.1',
    srcPort: 3306,
    dstHost: dbServer.host,
    dstPort: dbServer.port
};
const SSHConnection = new Promise((resolve, reject) => {
    sshClient.on('ready', () => {
        sshClient.forwardOut(
        forwardConfig.srcHost,
        forwardConfig.srcPort,
        forwardConfig.dstHost,
        forwardConfig.dstPort,
        (err, stream) => {
             if (err) reject(err);
             const updatedDbServer = {
                 ...dbServer,
                 stream
            };
            const connection =  mysql.createConnection(updatedDbServer);
           connection.connect((error) => {
            if (error) {
                reject(error);
            }
            resolve(connection);
            });
});
}).connect(tunnelConfig);
});