2013-12-22 1 views
1

Мне нужно вызвать соединение SSH из программы JAVA с помощью ProcessBuilder и комбинации USERID/PASSWORD.Как перехватить запрос SSH-пароля в программе Java

Я уже успешно реализовал соединения SSH с использованием Ganymed, JSch, сочетание сценариев JAVA Processbuilder и Expect (Expect4J), JAVA ProcessBuilder и скрипт SSHPASS и общий ключ SSH.

Безопасность не является проблемой в данный момент времени, и все, что я хочу, это возможность программно поддерживать все виды соединений для соединения SSH.

Моя проблема заключается в подсказке пароля, которую SSH выбрасывает где-то, где нет STDIN/STDOUT (по-моему, я полагаю). Это мое последнее препятствие для преодоления.

Мой вопрос: есть ли способ перехватить запрос SSH-пароля и предоставить его из моего кода JAVA?

Пожалуйста, обратите внимание, что это очень узкий вопрос (и вся вышеуказанная информация должна была гарантировать, что ответ не будет слишком широким).

Вот пример кода, что я пытаюсь:

import java.io.*; 
import java.util.*; 

public class ProcessBuilderTest { 
    public static void main(String[] args) throws IOException, Exception { 

     ProcessBuilder pb = new ProcessBuilder(
           "/usr/bin/ssh", 
           "[email protected]", 
           "export NOME='Jennifer Lawrence'; echo $NOME" 
           ); 


     pb.redirectErrorStream(); //redirect stderr to stdout 
     Process process = pb.start(); 
     InputStream inputStream = process.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
     String line = null; 
     while((line = reader.readLine())!= null) { 
      System.out.println(line); 
     } 
     process.waitFor(); 
    } 
} 

Но, когда я запускаю его я получил это:

[memphis BuilderTest]# java ProcessBuilderTest 

[email protected]'s password: 

и после того, как я ввожу пароль, я получил остальное выхода:

Jennifer Lawrence 

[memphis BuilderTest]# 

Опять же, конкретный вопрос: есть ли способ, чтобы породить в Externa l ssh client (OpenSSH, Tectia SSH, SecureCRT и т. д.) с использованием метода PasswordAuthentication (другой метод не может быть использован) с использованием интерфейса JAVA ProcessBuilder (не может использоваться другой язык), перехватывать/записывать приглашение пароля и отвечать/взаимодействовать, пароль из моего кода JAVA (так что пользователю не нужно вводить его)?

+1

Почему вы внедряете его по-разному? –

+0

Моя команда на работе создает инструменты на основе JAVA, которые будут использоваться командами инфраструктуры, и каждая команда имеет свой собственный способ делать что-то (это всемирная корпорация), и мы не можем ограничивать ситуацию, вызывая стандарт или шаблон. –

+0

Ну, есть причина, почему запрос пароля выполнен таким образом, что его нельзя перехватить. Причина в том, что жестко закодированные пароли в программах или сценариях, по меньшей мере, нежелательны. – Ingo

ответ

0

Вам нужно узнать о псевдо-ttys, предполагая, что вы работаете в Linux. Запрос пароля находится на устройстве tty. Вам нужно будет создать отдельный процесс, выполняющийся с псевдо-tty, вместо того, чтобы просто наследовать ваше устройство tty, а затем вы можете перехватить подсказку с паролем.

Это умеренно сложный процесс.

Существует библиотека, которая поддерживает некоторые из этих: http://www.ganymed.ethz.ch/ssh2/FAQ.html. Возможно, вы найдете его источник, освещенный, если он доступен.

+0

Это то, о чем я тоже думал, мои проблемы в этом случае: 1. Как выделить pty в JAVA (что еще хуже на Linux и Windows) 2. как уволить клиента ssh против этого распределения pty. Я искал iNet l; ooking для этого ответа (например, пример кода), и все, что я видел, довольно часто спрашивают об этих же вопросах. :( –

+0

Windows не имеет «pty в том же смысле, у меня нет рекомендаций для Windows». – bmargulies

+0

Прежде всего Спасибо за ответ. Ganymed - одна из чистых реализаций JAVA SSH, которые я использую в своем коде, так что Я собираюсь взглянуть на его источник. –

Смежные вопросы