Двухэтапная проверка с использованием библиотеки JSCH

Я пытаюсь использовать Java для подключения к серверу Linux, который имеет двухэтапную проверку входа в систему. Я использую библиотеку 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);

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

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

1 ответ

Решение

Я решил это в конце концов, вы должны реализовать 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 () - статический метод, который генерирует ключ)

Другие вопросы по тегам