1.说明
MySQL被部署在某个机器上,为了安全,需要通过一个跳板机进行访问,该跳板机可以有ssh访问,给了一个私钥Key文件和一个通行短语,如果是Python,可以paramiko库跳转连接,相关代码可以参考之前的文章,【python】SSH隧道远程连接mysql
本文是通过nodejs实现,由于我在网上没有找到类似的代码,故自己搞出来之后记录一下,也希望能帮到有跟我一样需求的同学
2.相关模块
因为环境用的是nodejs,所以可以直接使用npm安装就行,需要mysql2和ssh2这两个模块
npm install mysql2
npm install ssh2
3.代码
使用方式就是,首先通过ssh2连接上跳板机服务器,然后再利用forwardOut()方法转发数据,拿到stream,再传给MySQL就可以连接上了,参考代码如下
const mysql = require('mysql2');
const ssh2 = require('ssh2');
const { readFileSync } = require('fs');
const ssh_config = {
host: '远程IP',
port: 13102,
username: 'pan',
privateKey: readFileSync("E:\\panmeibing\\dingding\\key"),
passphrase: "PQ@L",
}
const mysqlConfig = {
host: '远程IP',
port: 3306,
user: 'pan',
password: '4N3X5l',
database: 'walletdb3'
}
const sshClient = new ssh2.Client();
sshClient.connect(ssh_config)
sshClient.on('error', (err) => {
console.log("connect ssh error:", err)
})
sshClient.on('close', () => {
console.log("connect ssh close")
})
sshClient.on('ready', () => {
console.log("connect ssh success")
sshClient.forwardOut(
ssh_config.host,
ssh_config.port,
mysqlConfig.host,
mysqlConfig.port,
(err, stream) => {
if (err) {
console.log(`ssh forward err: ${err}`)
return
}
// 连接跳板机之后该连接MySQL了
mysql_operate(stream)
}
)
})
function mysql_operate(stream) {
const mysqlConnection = mysql.createConnection({
stream: stream,
// 使用了ssh的steam就不需要指定MySQL的IP端口了
// host: ssh_config.host,
// port: ssh_config.port,
user: mysqlConfig.user,
password: mysqlConfig.password,
database: mysqlConfig.database,
});
// 执行SQL代码
mysqlConnection.query('select * from coin_token limit 1;', (err, rows, fields) => {
console.log('err:', err)
console.log('rows:', rows)
// console.log('fields:', fields)
});
mysqlConnection.end(() => {
console.log("mysql end")
sshClient.end(); // 如果不再使用记得关闭ssh连接
});
}