【js】SSH隧道远程连接mysql

1.说明

MySQL被部署在某个机器上,为了安全,需要通过一个跳板机进行访问,该跳板机可以有ssh访问,给了一个私钥Key文件和一个通行短语,如果是Python,可以paramiko库跳转连接,相关代码可以参考之前的文章,【python】SSH隧道远程连接mysql

本文是通过nodejs实现,由于我在网上没有找到类似的代码,故自己搞出来之后记录一下,也希望能帮到有跟我一样需求的同学

2.相关模块

因为环境用的是nodejs,所以可以直接使用npm安装就行,需要mysql2ssh2这两个模块

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连接
  });

}

你可能感兴趣的:(js,javascript,ssh,mysql,nodejs,js)