我正在尝试编写一个小的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