【问题标题】:Connect to MySQL using SSH Tunneling in node-mysql在 node-mysql 中使用 SSH 隧道连接到 MySQL
【发布时间】:2014-03-20 15:46:52
【问题描述】:

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

【问题讨论】:

    标签: javascript mysql node.js npm


    【解决方案1】:

    您可以完全独立地执行 SSH 隧道组件,然后使用基于 SSH 的 TCP 隧道将 node-mysql(或任何其他 sql 客户端...)指向您的数据库。

    像这样设置你的 SSH 隧道

    ssh -N -p 22 sqluser@remoteserverrunningmysql.your.net -L 33306:localhost:3306
    

    将其留在后台(有关详细信息,请参阅 articles like this)。

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

    【讨论】:

    • 这确实有效!确保连接始终运行的最佳方法是什么?
    • 我不确定最好的方法是什么,但this 可能是一个开始。
    【解决方案2】:

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

    ssh -f user@personal-server.com -L 2000:personal-server.com:25 -N

    -f 告诉 ssh 在执行命令之前进入后台。后面是您正在登录的用户名和服务器。 -L 2000:personal-server.com:25 采用 -L local-port:host:remote-port 的形式。最后 -N 指示 OpenSSH 不在远程系统上执行命令

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

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

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

    ssh -f elie@192.168.0.100 -L 2002:127.0.0.1:27017 -N

    在我的 mongo 连接中我会这样做:

    var mongoose = require('mongoose');

    mongoose.connect('mongodb://localhost:2002/mydatabase');

    module.exports = mongoose.connection;

    我希望这能说明问题。

    【讨论】:

      【解决方案3】:
      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);
      });
      

      【讨论】:

        猜你喜欢
        • 2018-11-06
        • 2014-03-21
        • 2018-10-06
        • 2019-03-09
        • 1970-01-01
        • 2012-06-19
        • 2015-12-21
        相关资源
        最近更新 更多