2016-09-08 3 views
0

Я пытаюсь использовать java для подключения к серверу Linux, у которого есть двухэтапная аутентификация. Я использую библиотеку JSch, это код, который я получил до сих пор:Двухэтапная аутентификация с использованием библиотеки JSCH

session = jsch.getSession(username, ip); 
Properties config = new java.util.Properties(); 
config.put("StrictHostKeyChecking", "no"); 
session.setConfig(config); 

session.setPassword(password); 
session.connect(); 
System.out.println("Connected to " + ip); 

Очевидно, когда я запускаю этот скрипт я получаю ошибку «Ошибка аутентификации» ошибка, как я не ввести ключ аутентификации. Итак, как мне войти с помощью ключа подтверждения. Если это невозможно, кто-то может предложить библиотеку с такой функциональностью.

Это вход в сервер с использованием шпатлевки. Таким образом, вы вводите имя пользователя, затем генерируемый по времени код, а затем пароль. enter image description here

+0

Ты возможность входа в этот хост с помощью командной строки ssh? Запустите ssh для входа на этот сервер и включите опцию '-vvv', чтобы сделать отладочную информацию вывода ssh. Затем отредактируйте свой вопрос, чтобы включить команду ssh, которую вы выполнили, и полученный результат. Это поможет людям узнать, как делается эта дополнительная проверка. – Kenster

+0

Это невозможно, так как дополнительная проверка основана на времени, поэтому секретная строка передается в метод java, который затем возвращает ключ для второй части проверки. –

+0

Пункт моего предложения состоял в том, чтобы понять, как этот шаг проверки выполняется через протокол ssh. – Kenster

ответ

0

В конце концов, я работал над этим, вы должны реализовать UserInfo и UIKeyboardInteractive. Используйте метод promptKeyboardInteractive, чтобы сделать его вернуть ключ аутентификации, показанный в следующем фрагменте кода, который работает для меня:

import java.security.InvalidKeyException; 

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 
import com.jcraft.jsch.UIKeyboardInteractive; 
import com.jcraft.jsch.UserInfo; 

public class UserAuthKI{ 
    public static void main(String[] arg){ 

try{ 
    JSch jsch=new JSch(); 

    String host=""; 
    String user=""; 

    Session session=jsch.getSession(user, host, 22); 

    // username and passphrase will be given via UserInfo interface. 
    UserInfo ui=new MyUserInfo(); 
    session.setUserInfo(ui); 
    session.connect(); 

    Channel channel =session.openChannel("exec"); 
    ((ChannelExec)channel).setCommand("echo 'hello'"); 

    channel.setInputStream(System.in); 
    channel.setOutputStream(System.out); 

    channel.connect(); 

} 
catch(Exception e){ 
    System.out.println(e); 
} 
    } 

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{ 
public String getPassword(){ return "passwordHere"; } 
public boolean promptYesNo(String str){ 
    return true; 
} 

public String getPassphrase(){return null;} 
public boolean promptPassphrase(String message){ return false; } 
public boolean promptPassword(String message){ 
    return true; 
} 
public void showMessage(String message){ 
    System.out.println(message); 
} 

public String[] promptKeyboardInteractive(String destination, 
              String name, 
              String instruction, 
              String[] prompt, 
              boolean[] echo){ 

    System.out.println("destination: "+destination); 
    System.out.println("name: "+name); 
    System.out.println("instruction: "+instruction); 
    System.out.println("prompt.length: "+prompt.length); 

    String[] str = new String[1]; 

    if(prompt[0].contains("Password:")){ 
     str[0] = getPassword(); 
    } 
    else if(prompt[0].contains("Verification code: ")){ 
     try { 
      str[0] = PasswordUtils.verify_code("CODEHERE"); 
     } catch (InvalidKeyException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    else{ 
     str = null; 
    } 

    return str; 

    } 
    } 
} 

(PasswordUtils.verif_code() является статический метод, который генерирует ключ)

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