在JSch中不断收到Auth失败异常,但我能够在没有密码的情况下ssh到IP [重复]

Posted

技术标签:

【中文标题】在JSch中不断收到Auth失败异常,但我能够在没有密码的情况下ssh到IP [重复]【英文标题】:Keep getting Auth fail exception in JSch but I was able to ssh to IP without a password [duplicate] 【发布时间】:2021-05-26 18:40:42 【问题描述】:

我正在尝试创建一个 JSch 隧道以通过 ssh 连接到一个 IP,这是一个运行脚本的无密码设置。当我手动对该 IP 执行 ssh 时,我不需要密码。 card.ipAddress 为 ssh 提供 IP 地址,这是一个无密码设置。我有log.info(打印)语句,所以我可以知道我到底在哪里得到了异常。 remoteShellScript有脚本的路径。

            com.jcraft.jsch.Session jschSession = null;

            try 
                    log.info("Entering try block of JSch session");
                    JSch jsch = new JSch();
                    jschSession = jsch.getSession(USERNAME, card.ipAddress, REMOTE_PORT);
                    log.info("after getSession");

                    // not recommend, uses jsch.setKnownHosts
                    jschSession.setConfig("StrictHostKeyChecking", "no");
                    log.info("after setting Config");
                    // authenticate using password
                    //jschSession.setPassword(PASSWORD);

                    // connect timeout session
                    jschSession.connect();                      //This is where I get the Exception
                    log.info("after connecting to jschSession");

                    ChannelExec channelExec = (ChannelExec) jschSession.openChannel("exec");

                    log.info("Channel is open");

                    // run a shell script
                    channelExec.setCommand("sh " + remoteShellScript + "\"" + cn_ip + "\" "  + duration);
                    log.info("after running script");

                    // display errors to System.err
                    channelExec.setErrStream(System.err);
                    log.info("after setErr");

                    //InputStream in = channelExec.getInputStream();

                    // 5 seconds timeout channel
                    channelExec.connect();

                    log.info("after connect");

             catch (Exception e) 
                    log.error("Catching exception", e);
                    e.printStackTrace();
             finally 
                    log.info("Disconnecting session from Finally block");
                    if (jschSession != null) 
                    jschSession.disconnect();
            

例外:

Catching exception: com.jcraft.jsch.JSchException: Auth fail      

                                                           

【问题讨论】:

无密码是否意味着您正在使用密钥进行身份验证,或者您真的意味着没有密码?前段时间有个问题,不需要密码,对比***.com/questions/62663771/… 【参考方案1】:

Jsch 需要您的密钥才能进行身份验证。

之后:

JSch jsch = new JSch();

添加:

jsch.addIdentity( "path/to/your/key" );

【讨论】:

密钥在~/.ssh/id_rsa.pub 我应该输入为jsch.addIdentity("~/.ssh/id_rsa.pub") 还是jsch.addIdentity(".ssh/id_rsa.pub")。当我打开 .pub 文件时,我看到 "ssh-rsa AGDGSOMERANDOMCHARACTERS root@some.host.name" 那么,我应该选择整个内容作为密钥吗?还是那些随机字符是私钥? 您需要将路径写入您的私钥。密钥必须已经在您运行代码的系统上的某个位置(因为您可以毫无问题地手动连接)。 是的,"~/.ssh/id_rsa.pub"".ssh/id_rsa.pub" 不被视为路径吗?我不知道是否在开头包含~/ sdasf: (1) 在shell中 ~ 是$HOME,但不是Java;如果您使用 $HOME 中的工作目录运行程序,通常情况下,您可以将目录保留在路径名 (2) 之外,如 Timon 所说,您需要提供 私钥文件 - 这就是"path/.ssh/id_rsa" 不是 "path/.ssh/id_rsa.pub".

以上是关于在JSch中不断收到Auth失败异常,但我能够在没有密码的情况下ssh到IP [重复]的主要内容,如果未能解决你的问题,请参考以下文章

LoginException:登录失败:安全异常

JSch SFTP 放入 IBM z/OS 失败:无法写入文件;嵌套异常为 3:权限被拒绝

我正在尝试使用 Jmeter 在 Intranet 上记录应用程序,但我不断收到 DNS 失败消息

在 My SQL 中不断收到外键约束失败消息

即使服务器的主机密钥存在于 known_hosts 文件中,JSch 连接也会因 UnknownHostKey 而失败

com.jcraft.jsch.JSchException: Auth fail