一、环境
在C#中可以使用Renci.SshNet
和MongoDB.Driver
通过SSH认证连接MongoDB数据库。
先去NuGet程序包管理页面中,下载Renci.SshNet
和MongoDB.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());
}
}
}