java - 在 Ubuntu 中连接到 VPN
问题描述
我使用了 VPN 服务并使用 java 代码连接到它并在 Ubuntu 上运行它。每当 sudo openvpn 命令完全运行时,控制台就会卡住并且在 while 循环之后不会转到代码。但是如果我包含代码在while循环内的sudo命令之后,它运行之后的代码,而不是sudo命令。我尝试添加“&”以便命令在后台运行但没有用。请提出一种方法来执行此操作,因为我尝试了各种解决方案但都是徒劳的。下面是我编写的代码。
public class curl {
void sudo() throws IOException {
String command1 = "sudo openvpn --config /etc/openvpn/configFile ";
System.out.println(command1);
Process curlProc1;
curlProc1 = Runtime.getRuntime().exec(command1);
DataInputStream curlIn1 = new DataInputStream(
curlProc1.getInputStream());
String outputString1;
while ((outputString1 = curlIn1.readLine()) != null) {
System.out.println(outputString1);
}
String urly = "MyURL";
URL obj = new URL(urly);
HttpURLConnection con1 = (HttpURLConnection) obj.openConnection();
con1.setRequestMethod("GET");
con1.setDoOutput(true);
int responseCode = con1.getResponseCode();
System.out.println("Response Code : " + responseCode);
BufferedReader iny = new BufferedReader(
new InputStreamReader(con1.getInputStream()));
String output;
StringBuffer response = new StringBuffer();
while ((output = iny.readLine()) != null) {
response.append(output);
}
iny.close();
System.out.println(response.toString());
}
public static void main(String args[]) throws IOException, ClassNotFoundException, SQLException, JSONException{
curl brc= new curl();
brc.sudo();
}
}
解决方案
您的问题是由 sudo 输出到错误流的事实引起的。这正在发生:
curlProc1 = Runtime.getRuntime().exec(command1);
- 你的程序启动 sudo
- 由于 sudo 默认在终端上工作,它输出“sudo: no tty present and no askpass program specified”或“Password:”到
stderr
while ((outputString1 = curlIn1.readLine()) != null) {
- 你的程序等待输入
stdout
- 由于您从未阅读过标准错误,sudo 将永远不会终止,因此,sudo 永远不会关闭标准输出,因此您的程序会卡住
解决此问题的一种快速方法是使用process builder,它具有将 thestderr
和 the组合stdout
在单个流中的有用选项,这意味着您只需要 1 个线程来读取流,并保持代码简单。
ProcessBuilder pb =
new ProcessBuilder("sudo", "openvpn", "--config", "/etc/openvpn/configFile");
pb.redirectErrorStream(true);
Process curlProc1 = pb.start();
....
由于 sudo 可能会要求输入密码(您可以将其配置为要求输入密码而不是给出错误),因此您可以在 收到密码提示后通过写入进程的输入流来提供密码:
p.getOutputStream().write("correct battery horse staple\n".getBytes(STandardCharsets.UTF_8));
推荐阅读
- ios - 以下两种方法的 Apple 组合等效项是什么?
- python - Docker 数据库访问被拒绝
- ruby - 在 ruby 中进行可重新启动的下载
- checkout - Design Sync 不会还原本地更改
- javascript - 将 JWT 令牌用于用户和应用程序
- ios - 为什么 Swift 对象在 Objective-C 代码中被声明/未声明为属性时表现不同?
- python - 使用Python进行语音分析)如何在x轴上及时查看语音文件的分析结果,在y轴上查看分贝数?
- c# - Onion Architecture - 需要来自基础设施的信息的领域模型方法
- javascript - onMouseLeave 与 Chrome 密码存储菜单的交互
- forms - Flutter 错误“构建函数返回 null”