如何在C#中配置带SSH(.ppk文件)的PostgreSQL连接字符串
用C#通过SSH密钥(.ppk)连接Linux上的PostgreSQL
Npgsql本身不直接支持SSH隧道连接,需要先通过SSH建立本地端口转发,再让Npgsql连接到本地转发的端口。以下是具体步骤:
1. 转换.ppk私钥为OpenSSH格式
大部分.NET SSH库只支持OpenSSH格式的私钥,需要用PuTTYgen转换:
- 打开PuTTYgen,点击「Load」加载你的.ppk文件
- 点击「Conversions」→「Export OpenSSH key」,保存为无扩展名的文件(比如
id_rsa) - 如果.ppk有密码,记住这个密码,后续代码需要用到
2. 使用SSH.NET建立SSH隧道
先通过NuGet安装SSH.NET库(Install-Package SSH.NET),然后编写代码建立隧道并连接数据库:
using Renci.SshNet; using Npgsql; // SSH配置 string sshHost = "192.168.0.16"; string sshUser = "linux_ssh_username"; // Linux服务器的SSH登录用户名 string privateKeyPath = @"C:\Keys\id_rsa"; // 转换后的OpenSSH私钥路径 string privateKeyPass = "your_key_passphrase"; // 私钥密码(无则设为null) // 端口转发配置:本地5433端口映射到服务器的5432(PostgreSQL端口) int localForwardPort = 5433; string pgServerLocalAddr = "127.0.0.1"; // 服务器本地的PostgreSQL地址 int pgServerPort = 5432; // 建立SSH连接与端口转发 using var privateKeyFile = new PrivateKeyFile(privateKeyPath, privateKeyPass); using var sshClient = new SshClient(sshHost, sshUser, privateKeyFile); sshClient.Connect(); var forwardedPort = new ForwardedPortLocal("127.0.0.1", localForwardPort, pgServerLocalAddr, pgServerPort); sshClient.AddForwardedPort(forwardedPort); forwardedPort.Start(); // 连接PostgreSQL:目标地址改为本地转发端口 string connString = $"Host=127.0.0.1;Port={localForwardPort};Database=sale;Username=postgres;Password=123;SSL Mode=Require;Trust Server Certificate=true"; using var pgConn = new NpgsqlConnection(connString); pgConn.Open(); // 执行数据库操作(示例) using var cmd = new NpgsqlCommand("SELECT version();", pgConn); var result = cmd.ExecuteScalar(); Console.WriteLine($"PostgreSQL版本:{result}"); // 关闭资源 pgConn.Close(); forwardedPort.Stop(); sshClient.Disconnect();
注意事项
- 确保Linux服务器的SSH服务已开启,且你的公钥已添加到服务器用户的
~/.ssh/authorized_keys文件中 - 如果不想转换.ppk,也可以用PuTTY的
plink.exe命令行建立隧道:
运行该命令后,C#程序直接连接本地5433端口即可,但这种方式依赖外部进程,不如代码集成灵活。plink.exe -i C:\path\to\your\key.ppk ssh_user@192.168.0.16 -L 5433:127.0.0.1:5432
内容的提问来源于stack exchange,提问作者Mohsen
相关产品推荐
相关产品推荐

