You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,提问作者Василий Подгузов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:17:33