如何不编写ovpn临时文件即可连接OpenVPN服务器?
无临时文件调用OpenVPN的实现方法
OpenVPN原生支持从标准输入流读取配置与认证信息,无需生成实体临时文件即可完成连接,核心使用--config -参数声明从标准输入读取配置内容,再配合C#进程的输入流重定向写入内存中存储的配置、凭证数据即可。
调整后的实现代码
string ServerFileContents = "..."; // 你的完整ovpn配置内容 string UserPassContents = "..."; // 格式为第一行用户名、第二行密码 System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; startInfo.FileName = @"C:\Program Files\OpenVPN\bin\openvpn.exe"; // 声明从标准输入读配置、从标准输入读认证凭证 startInfo.Arguments = "--config - --auth-user-pass -"; startInfo.Verb = "runas"; // 开启输入流重定向,必须关闭ShellExecute startInfo.RedirectStandardInput = true; startInfo.UseShellExecute = false; process.StartInfo = startInfo; process.Start(); // 向标准输入流写入配置、凭证内容 using (var sw = process.StandardInput) { if (sw.BaseStream.CanWrite) { // 先写入完整的ovpn配置 sw.WriteLine(ServerFileContents); // 再写入认证凭证 sw.WriteLine(UserPassContents); } } // 可选:等待进程执行、处理输出等逻辑 // process.WaitForExit();
补充说明
- 如果你的ovpn配置依赖额外的证书、密钥文件,可以直接将对应内容以内联标签的形式写入配置内容中,比如
<ca>CA证书内容</ca>、<cert>客户端证书内容</cert>、<key>客户端密钥内容</key>,无需再单独引用外部文件,实现全内存运行。 - 若需OpenVPN以管理员权限运行,由于重定向输入流要求
UseShellExecute = false会导致Verb = "runas"失效,建议直接给你的封装程序本身添加要求管理员权限的manifest配置,启动时就获得管理员权限,再启动OpenVPN进程即可正常继承权限。 - 如果遇到编码识别异常,可在写入流的时候显式指定UTF8编码匹配OpenVPN的文件读取规则。
内容的提问来源于stack exchange,提问作者Flint Charles
相关产品推荐
相关产品推荐

