首页 > 解决方案 > 如何在不传递用户名和密码的情况下通过java连接到unix

问题描述

如何在不传递用户名和密码的情况下从 java 连接到远程 unix 主机。

下面的代码是我正在使用的

   package testing;     

    import java.io.InputStream;

    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;

    public class Test {

        public static void main(String[] args) {

            execute();
        }

            public static void execute() {
                    try {
                        JSch jsch = new JSch();

                        String user = "xxxx";
                        String host = "xxxxxx";
                        int port = 22;
                        String privateKey = "xxxxxxxxx";

                        jsch.addIdentity(privateKey);
                        System.out.println("identity added ");

                        Session session = jsch.getSession("nudayaku","cloudgw-dev-01" );
                        System.out.println("session created.");
                        session.setConfig("PreferredAuthentications", "publickey");
                        java.util.Properties config = new java.util.Properties();    
                        config.put("StrictHostKeyChecking", "no");      
                        session.setConfig(config);  
                        session.connect();
                        System.out.println("session connected.....");

                    } catch (Exception e) {
                        System.err.println(e);
                    }
                }
    }

请找出以下错误。

堆栈跟踪错误

com.jcraft.jsch.Session.connect(Session.java:519)
     com.jcraft.jsch.Session.connect(Session.java:183)
     testing.Test.execute(Test.java:39)
     testing.Test.main(Test.java:17)

标签: javaunix

解决方案


根据迄今为止的证据,最可能的原因是(IMO):

  1. 您使用了错误的主机,并且该主机上不存在该帐户。
  2. 您为远程帐户使用了错误的用户名
  3. 您使用的私钥与为远程帐户记录的公钥之一不匹配
  4. 远程服务器未配置为接受 PublicKey 身份验证。
  5. 远程帐户的~/.ssh目录配置不正确。一个常见的问题是~/.ssh目录或~/.ssh/authorized_keys文件太开放。

我认为我们可以消除私钥文件的问题。我认为这会给你一个不同的例外。


如果以上都不是原因,那么您需要在调试级别打开 JSch 日志记录,以更深入地了解正在发生的问题。不幸的是,JSch 默认不使用日志框架,但是在 JSch 示例页面中有一个示例提供了可以借用的代码:

最后,如果客户端日志没有帮助,请查看是否可以(暂时)打开sshd远程服务器端的调试。(请注意,这sshd是一个安全/隐私问题。将记录有关所有SSH 连接的敏感信息。)


这不是问题,但是下面的代码看起来有点奇怪:

session.setConfig("PreferredAuthentications", "publickey");
java.util.Properties config = new java.util.Properties();    
config.put("StrictHostKeyChecking", "no");      
session.setConfig(config);  

你为什么不把最后 3 个语句写成如下?

session.setConfig("StrictHostKeyChecking", "no");

推荐阅读