使用org.hidetake.ssh Gradle插件SSH登录时谷歌验证器授权失败求助
解决org.hidetake.ssh插件Google Authenticator登录报错问题
问题场景
使用Gradle插件org.hidetake.ssh,通过用户名+私钥+Google Authenticator OTP登录SSH主机时,抛出错误:
com.jcraft.jsch.JSchException: Auth cancel for methods 'keyboard-interactive'
但通过常规SSH客户端连接时,输入OTP验证码即可正常登录,期望Gradle脚本能在VSCode终端中请求OTP完成授权。
当前配置代码:
remotes.create('preprod') { host = '10.10.10.10'//todo old IP user = 'test' identity = file(adminKeyPath) knownHosts = allowAnyHosts }
原因分析
报错是因为org.hidetake.ssh基于JSch实现,默认未配置**键盘交互式认证(keyboard-interactive)**的处理器,而Google Authenticator的OTP验证属于这类认证流程,插件无法自动处理OTP输入导致认证取消。
解决方案
自定义JSch的UserInfo实现,处理键盘交互的OTP请求,让Gradle在终端中提示用户输入验证码,然后将该自定义类关联到远程配置中。
步骤1:实现自定义UserInfo类
在Gradle脚本中添加以下代码,实现支持OTP输入的UserInfo:
import com.jcraft.jsch.UserInfo import com.jcraft.jsch.UIKeyboardInteractive class OtpUserInfo implements UserInfo, UIKeyboardInteractive { String password String otpCode @Override String getPassphrase() { return null } @Override String getPassword() { return password } @Override boolean promptPassword(String message) { println message password = System.console().readLine() return password != null } @Override boolean promptPassphrase(String message) { return false } @Override boolean promptYesNo(String message) { println message String input = System.console().readLine().trim().toLowerCase() return input == 'y' || input == 'yes' } @Override void showMessage(String message) { println message } @Override String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo) { // 匹配Google Authenticator的OTP提示(根据实际提示文本调整) if (prompt.length == 1 && prompt[0].contains('Verification code')) { println instruction println prompt[0] otpCode = System.console().readLine() return [otpCode] } return null } }
步骤2:修改远程配置关联自定义UserInfo
更新原有的remote配置,添加userInfo属性:
remotes.create('preprod') { host = '10.10.10.10'//todo old IP user = 'test' identity = file(adminKeyPath) knownHosts = allowAnyHosts // 关联自定义OTP用户信息处理器 userInfo = new OtpUserInfo() }
说明
- 运行Gradle任务时,VSCode终端会提示输入OTP验证码,输入后即可完成认证。
- 若服务器的OTP提示文本不同,需调整
promptKeyboardInteractive方法中的判断逻辑(比如匹配"OTP"、"验证码"等关键词)。
内容的提问来源于stack exchange,提问作者Василий Подгузов
相关产品推荐
相关产品推荐

