【Node.js】通过SSH连接到Redis数据库

简要

使用ioredis和ssh2模块,通过SSH连接到Redis。

环境

    • Node.js v8.15.0

 

    • ioredis v4.2.0

 

    ssh2 v0.8.2

办法

加载依赖模块。

const Redis = require('ioredis');
const { Client: SSHClient } = require('ssh2');
const net = require('net');
const fs = require('fs');

我会准备一个函数用于连接到SSH服务器。

function connectToSSH(options) {
  return new Promise((resolve, reject) => {
    const connection = new SSHClient();

    connection.once('ready', () => resolve(connection));
    connection.once('error', reject);

    connection.connect(options);
  });
}

我們將準備一個用於連接到 Redis 的助手函數。

function connectToRedis(options) {
  const redis = new Redis(options);
  return new Promise((resolve, reject) => {
    redis.once('error', reject);
    redis.once('ready', () => resolve(redis));
  });
}

创建一个用于端口转发的中间服务器。

当将0作为server.listen的第一个参数传递时,系统将分配一个可用端口。

function createIntermediateServer(connectionListener) {
  return new Promise((resolve, reject) => {
    const server = net.createServer(connectionListener);
    server.once('error', reject); 
    server.listen(0, () => resolve(server));
  });
}

我们将编写一个函数来打通SSH并连接到Redis,这个函数将整理一系列的辅助函数。

async function connectToRedisViaSSH(options = {
  ssh: {
    host: 'localhost',
    port: 22
  },
  redis: {
    host: 'localhost',
    port: 6379
  }
}) {
  const sshConnection = await connectToSSH({
    host: options.ssh.host,
    port: options.ssh.port,
    username: options.ssh.username,
    privateKey: options.ssh.privateKey,
    passphrase: options.ssh.passphrase
  });

  const server = await createIntermediateServer(socket => {
    sshConnection.forwardOut(
      socket.remoteAddress,
      socket.remotePort, 
      options.redis.host,
      options.redis.port,
      (error, stream) => {
        if (error) {
          socket.end();
        } else {
          socket.pipe(stream).pipe(socket);
        }
      }
    );
  });

  // Redisサーバのアドレスではなく、中間サーバのアドレスを指定します。
  const redis = await connectToRedis({
    host: server.address().address,
    port: server.address().port
  });

  return redis;
}

使用创建的函数连接到Redis。

const redis = await connectToRedisViaSSH({
  ssh: {
    host: '<ssh-server-address>',
    port: 22,
    username: '<username>',
    privateKey: fs.readFileSync('/path/to/private-key'),
    passphrase: '<passphrase>'
  },
  redis: {
    host: '<redis-server-address>',
    port: 6379
  }
});
const keys = await redis.keys('*');
console.log(keys);

请参照以下内容,在中文中进行还原概述,只需要一个选项:

广告
将在 10 秒后关闭
bannerAds