背景
目前通过JSCH和SSHD登录服务器的方式基本都是密码或者密钥认证,但有些服务器在密码登录后会有个二次验证,一般是TOTP验证码。下面就是用xshell连接服务器后弹出的二次验证:
JSCH和SSHD的官方文档没有详细的例子说明如何通过这个二次验证,研究文档的接口和参数后找到了结合密码和二次验证码登录服务器的方法。
JSCH实现
jsch首先需要给session添加配置:
session.setConfig("PreferredAuthentications", "password,keyboard-interactive");
然后新建类实现以下两个接口
UIKeyboardInteractive, UserInfo
实现promptKeyboardInteractive方法,返回二次验证码
@Override
public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo) {
response[0] = "二次验证码"
return response;
}
创建接口实现类对象给session
session.setUserInfo(new UserInfoImpl());
这样jsch就会自动把二次验证码回填给服务器通过验证。完整代码如下:
JSch jsch = new JSch();
Session session = jsch.getSession("用户名", "服务器地址", 端口);
// 服务器密码
session.setPassword(config.getPassword());
session.setConfig("StrictHostKeyChecking", "no");
// 两步认证,密码 + 谷歌验证码
session.setConfig("PreferredAuthentications", "password,keyboard-interactive");
session.setUserInfo(new UserInfoImpl());
session.connect(5000);
SSHD实现
sshd和jsch类似,同样需要实现接口创建对象给ClinetSession。首先新建类实现接口
UserInteraction
实现interactive方法,返回二次验证码
@Override
public String[] interactive(ClientSession session, String name, String instruction, String lang, String[] prompt, boolean[] echo) {
String[] response = new String[prompt.length];
response[0] = "二次验证码"
return response;
}
创建接口实现类对象给ClinetSession
session.setUserInteraction(new UserInteractionImpl);
完整代码如下:
SshClient sshClient = SshClient.setUpDefaultClient();
sshClient.setSessionHeartbeat(SessionHeartbeatController.HeartbeatType.IGNORE, Duration.ofMinutes(5));
sshClient.start();
ClientSession session = sshClient.connect("用户名", "服务器地址", 端口).verify(5 , TimeUnit.SECONDS).getSession();
// 服务器密码
session.addPasswordIdentity(sshConfig.getPassword());
// 两步认证,密码 + 谷歌验证码
session.setUserInteraction(new UserInteractionImpl);
session.auth().verify();
结语
通过以上两个方法都可以实现密码+二次验证码的方式登录服务器。二次验证码可以手动输入或通过密钥生成。
标签:JSCH,SSHD,String,二次,验证码,session,new,服务器 From: https://blog.51cto.com/u_17039964/12118075