Взаимодействие с openconnect в Java ProcessBuilderJAVA

Программисты JAVA общаются здесь
Anonymous
Взаимодействие с openconnect в Java ProcessBuilder

Сообщение Anonymous »

Я пытаюсь установить VPN-соединение с помощью ProcessBuilder на Java. Однако процесс, похоже, блокируется, и ввод моего пароля не имеет никакого эффекта.
Я не могу включить свое имя пользователя и пароль непосредственно в командную строку, поскольку они могут меняться со временем, и для из соображений безопасности иногда запрашивают второй пароль.
Любая помощь приветствуется
Здесь я использую трюк с «эхо-паролем» поэтому я успешно подключаюсь к VPN, даже когда мне не предлагают ввести второй пароль.
Я пытаюсь решить эту головоломку, чтобы при необходимости предоставить второй пароль.
форма открывается корректно при запросе второго пароля + logger.info("Next token: " + nextToken); печатает введенный мной токен.
РЕДАКТИРОВАТЬ, реальный сценарий в моем приложении:
Запускается кнопкой:
@Override
protected void execClickAction() {
String password = ... //comes from a widget
try {
String command = "echo \"" + password + "\" | nohup sudo openconnect --protocol=nc -u user adress --passwd-on-stdin";
ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", command);
Process process = processBuilder.start();

ExecutorService executor = Executors.newFixedThreadPool(2);
Future connectionFuture = executor.submit(() -> waitForVPNConnection(process));

Integer isConnected = connectionFuture.get(30, TimeUnit.SECONDS);

//case 2 means we are prompted to put the next password to validate the connection
if (isConnected == 2) {
logger.info("Next token is required.");

//ouvrir le next token form, recuperer le token
Form form = new Form();
form.start();
form.waitFor();
String nextToken = form.getNewToken();
logger.info("Next token: " + nextToken);

// Send the next token
if (nextToken != null && !nextToken.isEmpty()) {
sendToken(process, nextToken);
isConnected = waitForVPNConnection(process); //
boolean canPing = pingIPAddress(FTPADRESS, 5);
if (canPing) {
isConnected = 1;
} else {
isConnected = 0;
}
} else {
logger.error("No token found");
isConnected = 0;
}
}

handleConnectionResult(isConnected);

executor.shutdown();
} catch (IOException | InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
}
Form.this.doClose();
}

//to communicate with the openconnect thread...
private static void sendToken(Process process, String token) throws IOException {
OutputStreamWriter writer = new OutputStreamWriter(process.getOutputStream(), "UTF-8");
writer.write(token);
writer.write("\n");
writer.flush();
logger.info("Token sent: " + token);
try {
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}

private static Integer waitForVPNConnection(Process process) {
boolean isConnected = false;
boolean firstPasswordPromptHandled = false;

try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
String line;
while ((line = reader.readLine()) != null || (line = errorReader.readLine()) != null) {
logger.info(line); // Print logs to console or handle them accordingly

// Check for specific tokens in the logs that indicate the VPN connection is established
if (line != null && line.contains("ESP session established with server")) {
isConnected = true;
break;
}

// Handle additional token requests
if (line != null && (line.contains("frmNextToken") || line.contains("password:"))) {
if (!firstPasswordPromptHandled) {
logger.info("First password prompt handled by echo: " + line);
firstPasswordPromptHandled = true;
} else {
logger.info("Detected token request in logs: " + line);
return 2;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return isConnected ? 1 : 0;
}


Подробнее здесь: https://stackoverflow.com/questions/786 ... essbuilder

Вернуться в «JAVA»