C#使用SSH认证连接MongoDB

一、环境

在C#中可以使用Renci.SshNetMongoDB.Driver通过SSH认证连接MongoDB数据库。

先去NuGet程序包管理页面中,下载Renci.SshNetMongoDB.Driver

二、使用

可以先通过SshNet库使用SSH认证连接MongoDB所在的服务器,再用MongoDB.Driver连接本地SshNet达到通过SSH认证连接MongoDB的目的。

实现代码

using System;
using System.Collections.Generic;
using MongoDB.Driver;
using Renci.SshNet;

public class MongoAdmin
{
    // 数据库连接参数
    private const string MONGODB_URI = "mongodb://root:123456@127.0.0.1:3717/admin";

    private const string SSH_USER = "root";          // ssh账号
    private const string SSH_PASSWORD = ".";         // ssh密码,若使用密钥且没密码时填空
    private const string SSH_PRVKEY = "./ssh.pem";   // ssh密钥,若使用密码登录时为空
    private const string SSH_HOST = "192.168.0.105"; // ssh服务器
    private const int    SSH_PORT = 22;              // ssh端口

    public static void Test()
    {
        try
        {
            var uri = new Uri(MONGODB_URI);

            // 存在密钥文件使用密钥登录,不存在密钥文件使用密码登录
            ConnectionInfo conn = null;
            if (string.IsNullOrEmpty(SSH_PRVKEY))
            {
                conn = new ConnectionInfo(SSH_HOST, SSH_PORT, SSH_USER, new PasswordAuthenticationMethod(SSH_USER, SSH_PASSWORD));
            }
            else
            {
                conn = new ConnectionInfo(SSH_HOST, SSH_PORT, SSH_USER, new PrivateKeyAuthenticationMethod(SSH_USER, new PrivateKeyFile(SSH_PRVKEY)));
            }

            // 连接SSH
            var cli = new SshClient(conn);
            cli.Connect();

            var port = new ForwardedPortLocal("127.0.0.1", SSH_HOST, (uint)uri.Port);
            cli.AddForwardedPort(port);
            port.Start();

            // 用本地端口替换mongodb uri中配置端口
            var mUri = MONGODB_URI.Replace($":{uri.Port}", $":{port.BoundPort}");

            var mCli = new MongoClient(mUri);
            var mdb = mCli.GetDatabase("test");

            foreach ( var name in mdb.ListCollectionNames().ToList())
            {
                Console.WriteLine(name);
            }
        }
        catch(Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
}
0%