在 node-mysql 中使用 SSH 隧道连接到 MySQL
Posted
技术标签:
【中文标题】在 node-mysql 中使用 SSH 隧道连接到 MySQL【英文标题】:Connect to MySQL using SSH Tunneling in node-mysql 【发布时间】:2014-03-20 15:46:52 【问题描述】:使用node-mysql
npm 包时,是否可以使用 SSH 密钥而不是密码连接到 MySQL 服务器?
【问题讨论】:
【参考方案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);
);
【讨论】:
以上是关于在 node-mysql 中使用 SSH 隧道连接到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章