Java应用程序无法通过exec函数

时间:2018-09-03 09:05:33

标签: java bash shell openvpn

我正在尝试编写一个小的Java应用程序来启动openvpn配置文件。因此,我首先将Mac上的sudoers文件更改为:

USERNAME ALL=(ALL:ALL) NOPASSWD: /usr/local/Cellar/openvpn/2.4.6/sbin/openvpn

我通过命令USERNAME得到了whoami。这部分工作正常,因为当我现在键入

sudo openvpn /directory/of/openvpn/file.ovpn

进入我的Mac上的终端。我不必插入任何密码,openvpn配置文件开始运行。之后,我现在想使用我的Java应用程序执行相同的工作。因此,我有以下设置:

public class Connector {

    public static String executeCommand(String... command) {
        StringBuffer output = new StringBuffer();
        Process p;
        try {
            p = Runtime.getRuntime().exec(command);
            System.out.println(p.waitFor());
            InputStreamReader in = new InputStreamReader(p.getInputStream());
            BufferedReader reader = new BufferedReader(in);
            String line = "";
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }
            p.destroy();
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return output.toString();
    }


    public static void main(String[] args) {
        String[] command = new String[3];
        command[0] = "/bin/sh";
        command[1] = "-c";
        command[2] = "/usr/bin/sudo -S /usr/local/Cellar/openvpn/2.4.6/sbin/openvpn /directory/of/openvpn/file.ovpn";

        String result = Connector.executeCommand(command);
        System.out.println(result);
    }
}

对于command[2],我还尝试了不带-S标志以及通过echo password | sudo command提供密码。对于command[0],我还使用了/bin/bash而不是/bin/sh。但是,一切都会导致相同的结果。该应用程序无限运行。控制台内无输出。并没有打开openvpn配置文件,因为现在我键入

killall openvpn

进入Mac上的终端后,我得到了没有打开连接的信息。

No matching processes belonging to you were found

如果我不使用sudo命令

command[2] = "/usr/local/Cellar/openvpn/2.4.6/sbin/openvpn /directory/of/openvpn/file.ovpn";

我得到的输出显示我没有运行配置文件的权限。这是在Mac上的终端中手动键入以上命令时得到的输出。

Opening utun (connect(AF_SYS_CONTROL)): Operation not permitted (errno=1)

更新

我将功能executeCommand更改为

public static String executeCommand(String... command) {
    try {
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec(command);
        InputStream stderr = proc.getErrorStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        System.out.println("<ERROR>");
        while ( (line = br.readLine()) != null)
            System.out.println(line);
        System.out.println("</ERROR>");
        int exitVal = proc.waitFor();
        System.out.println("Process exitValue: " + exitVal);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

现在我在控制台中收到一条错误消息,内容为

<ERROR>
ifconfig: ioctl (SIOCDIFADDR): Can't assign requested address
route: writing to routing socket: File exists

0 个答案:

没有答案