【问题标题】:Openvpn connection programmatically in java在java中以编程方式打开vpn连接
【发布时间】:2020-09-21 14:48:08
【问题描述】:

我想开发一个与 VPN 配合使用的自动化应用程序。为此,我有 Openvpn 配置文件。但是,我不知道如何连接。 this 链接中提到了一个解决方案,但它对我不起作用。我在哪里以及如何输入我的 vpn 用户和密码?我在这方面的研究中没有得到任何结果。

我想做的应用程序将简单地工作如下。例如,我将有 50 个 vpn,我的程序将通过分别连接每个 vpn 来连接到目标站点。但是,正如我所说,我不知道如何使用 java 建立 openvpn 连接。你能帮我解决这个问题吗?以下是我为我想做的事情编写的代码。例如,我想通过意大利 vpn 位置连接到 google。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {

        Runtime runtime = Runtime.getRuntime();
        try {
            Process process = runtime.exec("C:\\Program Files\\OpenVPN\\bin\\openvpn C:\\Users\\DATABASE\\OpenVPN\\config\\italy\\italy.ovpn");
        } catch (IOException e) {
            e.printStackTrace();
        }


        System.setProperty("webdriver.gecko.driver", "C:\\geckodriver\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();

        try {
            driver.get("https://www.google.com/");
        } finally {
            driver.quit();
        }
    }
}

【问题讨论】:

    标签: java vpn openvpn


    【解决方案1】:

    从命令行运行 OpenVPN 客户端,您需要使用单独的文本文件输入用户名和密码。

    1. 在与 .ovpn 文件相同的文件夹中创建一个文本文件。对于这个例子italy.txt
    2. 将您的用户名和密码放在文件中的新行中,如下所示:
    username
    password
    
    1. 保存文本文件。

    看到Runtime.exec 不再工作(或者它最终按预期工作,但在这种情况下没有给出结果),我们需要切换到ProcessBuilder

    这是一个使用问题中定义的单个 VPN 连接的示例。

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Test {
        private static final String NEW_LINE = System.getProperty("line.separator");
        
        public static void main(String[] args) {        
            StringBuilder result = new StringBuilder(80);
            try {
                ProcessBuilder pb = new ProcessBuilder("C:\\Program Files\\OpenVPN\\bin\\openvpn.exe", "--config", "C:\\Users\\DATABASE\\OpenVPN\\config\\italy\\italy.ovpn", "--auth-user-pass", "C:\\Users\\DATABASE\\OpenVPN\\config\\italy\\italy.txt").redirectErrorStream(true);
                Process process = pb.start();
                try (BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())))
                {
                    while (true)
                    {
                        String line = in.readLine();
                        if (line == null)
                            break;
                        result.append(line).append(NEW_LINE);
                    }
                }
            } catch (IOException e) {
            }
            
            System.out.println(result.toString());
        }
    }
    

    这将打开一个 VPN 隧道,只要启动 Test 类的终端/程序没有被杀死,它就会保持打开状态。

    请注意,除非命令失败,否则它不会给出任何输出!在正常操作的情况下,您只会看到一个空白屏幕。

    您需要为自己实现一个业务逻辑,然后在完成后关闭 VPN 隧道,然后再打开一个新隧道(除非您希望最终在彼此内部有 50 个隧道,这甚至可能无法正常工作) .

    【讨论】:

    • 它正在从命令行运行,但无法处理我上面的代码
    • @idrisyagci 如果第二种方法对您有用,您可以尝试一下吗?也许 " 不正确,不确定 runtime.exec 这一行将如何解析和执行。
    • 您的代码在命令行上运行,但不适用于 java。当我运行此代码时,命令行不会打开。而且openvpn有一个图形界面,当我使用openvpn-gui.exe编码时它也没有打开我从控制台检查了openvpn-gui的参数并根据它进行编码,但没有任何改变。
    • @idrisyagci 我已经更新了答案。这是在带有 OpenVPN cli 的 Windows 10 上测试的,它适用于我。注意隧道陷阱中的隧道,因为它只会在失败或被杀死时关闭并返回输出。
    • 你写的代码理论上是可以的,但是如果实用的话,我觉得openvpn有问题。 Openvpn 不能从控制台工作,但在使用 gui 时工作。因此,当我像这样编辑代码时,它起作用了。 "C:\\Program Files\\OpenVPN\\bin\\openvpn-gui.exe", "--connect", "italy.ovpn" 但是,我仍然认为您的回答是正确的。
    猜你喜欢
    • 2015-10-21
    • 2014-09-18
    • 2010-10-26
    • 2011-10-27
    • 2021-09-13
    • 2013-04-25
    • 2015-04-10
    • 2011-10-24
    • 2012-06-05
    相关资源
    最近更新 更多