尝试使用java在远程unix服务器上执行脚本时出错

尝试使用java在远程unix服务器上执行脚本时出错,java,jsch,Java,Jsch,我试图在远程服务器上运行shell脚本,以检索消费者组和偏移量列表。这是一种替代方法,而不是通过jvm[}使用 其他已发布的问题可能有解决方案,但我不确定如何检索和检索哪个主机密钥。我可以在服务器上看到3个主机密钥服务器文件,但不确定要复制哪个文件 以下是代码和错误: JSch jsch = new JSch(); String keyString = ""; //byte [] key = Base64.getDecoder().decode("b6:83:60:7c:

我试图在远程服务器上运行shell脚本,以检索消费者组和偏移量列表。这是一种替代方法,而不是通过jvm[}使用

其他已发布的问题可能有解决方案,但我不确定如何检索和检索哪个主机密钥。我可以在服务器上看到3个主机密钥服务器文件,但不确定要复制哪个文件

以下是代码和错误:

    JSch jsch = new JSch();
    String keyString = "";
    //byte [] key = Base64.getDecoder().decode("b6:83:60:7c:4a:98:00:ef:b9:4a:ba:b6:80:39:d6:42");
    //HostKey hostkey = new HostKey(host,key);
    //jsch.getHostKeyRepository().add(hostkey, null);

    jsch.setKnownHosts(new FileInputStream("C:\\Users\\.ssh\\host"));

    Session session = jsch.getSession(uname, host, 22);
    Properties config = new Properties();
    //config.put("StrickHostKeyChecking","no");
    session.setConfig(config);
    session.setPassword(pword);

    session.connect();
这是在session.connect()行上产生的错误:

编辑:

尝试对从服务器复制到客户端的ssh_host_rsa_key.pub文件进行以下更改。添加了以下内容:

    JSch jsch = new JSch();
    String keyString = "";
    //byte [] key = 
     Base64.getDecoder().
         decode("b6:83:60:7c:4a:98:00:ef:b9:4a:ba:b6:80:39:d6:42");
    //HostKey hostkey = new HostKey(host,key);
    //jsch.getHostKeyRepository().add(hostkey, null);
     jsch.setKnownHosts("C:\\Users\\.ssh\\ssh_host_rsa_key.pub");

    Session session = jsch.getSession(uname, host, 22);
    Properties config = new Properties();
    session.setConfig(config);
    session.setPassword(pword);
    session.connect();
创建与JSCHEException相同的错误:UnknownHostKey…RSA密钥为fingerporint。然后尝试以下方法实际读取文件内容:

     String knownHostPublicKey = "";
     String readLine = "";
     BufferedReader fr = new BufferedReader(new 
            FileReader("C:\\Users\\.ssh\\ssh_host_rsa_key.pub"));
    while((readLine = fr.readLine()) != null){
        knownHostPublicKey = readLine;
        System.out.println(knownHostPublicKey);
    }

  //  jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

    session.connect();
SSH协议(与其他加密协议不同)对客户端和服务器进行身份验证

客户端(您的代码)使用密钥(对于自动化系统来说通常是首选)或用户名/密码对进行身份验证。您已经了解了这一部分

服务器端(远程系统)使用主机密钥对自己进行身份验证,客户端可以使用该主机密钥确认它正在与它期望的服务器进行通信。理论上,如果你患有妄想症,你可以传输主机密钥的公钥部分(或至少是它的指纹)通过带外安全机制从服务器到客户端。实际上,大多数人在第一次连接到服务器时只需确认主机密钥,然后将其存储在客户端上的
已知\u hosts
文件中。(也就是说,大多数人使用策略。)

当您第一次使用自动化流程连接到新服务器时,问题就出现了。您如何确定所连接的服务器是您想要的服务器?如果网络上有一个邪恶的人正在对您进行中间人攻击,您将为此人提供所需的用户名和密码登录到真正的服务器,您的代码将永远不会更明智

解决此问题的主要方法有两种。首先,您可以手动从远程服务器收集主机密钥,然后将其保存到已知的主机文件中以供自动化处理。只要您可以手动连接,这很简单:只需使用命令行SSH客户机连接到服务器,在提示符下确认新的主机密钥,然后使用c将
~/.ssh/known_hosts
文件(或等效文件)从用户的主目录复制到自动进程使用的位置

根据错误消息,您需要的主机密钥是RSA密钥(带有指纹
b6:83:60:7c:4a:98:00:ef:b9:4a:ba:b6:80:39:d6:42
)。假设远程Unix服务器正在使用OpenSSH或兼容的实现,RSA主机密钥的默认位置是
/etc/ssh/ssh\u host\u RSA\u key
,但此路径可以通过中的指令进行更改。要输入到
已知\u hosts
文件中的值是与此p对应的公钥rivate密钥——通常存储在
/etc/ssh/ssh\u host\u rsa\u key.pub
中。同样,获得正确格式的最简单方法是只需连接其他ssh客户端,确认主机密钥,然后检查您获得的
已知主机
文件


一个不太安全的替代方案是告诉你的客户简单地忽略主机密钥,并希望最好的。(也许你信任你的网络,以至于你不担心中间的一个人,但是如果你相信它那么多,那么你可能也不需要SSH。)这就是

StrictHostKeyChecking=no
设置的作用,我注意到它是在注释中设置的,尽管拼写错误。

非常感谢您的详细解释。我在该服务器ssh目录中有一些主机文件,不确定使用哪个,但感谢您指出RSA主机文件。不过它似乎不包含这些文件特定指纹。但我会将文件内容复制到客户端计算机,看看是否works@vbNewbie:请注意,
/etc/ssh/ssh\u host\u rsa\u key
是您不希望从服务器中过滤掉的私钥!您需要相应的公钥,该公钥将存储在
/etc/ssh/ssh\u host\u rsa\u key.pub
.T中
.pub
文件的内容应全部放在一行文本中:该行应添加到您的
已知主机
文件中。很抱歉,一直打扰您,但我无法使此工作正常。尝试读取文件内容,但无效,然后只设置jsch.setknownhosts(文件名)因此,在这两种情况下,都会出现相同的错误。我已从远程服务器复制了该文件。请设置问题编辑:@vbNewbie+
已知的\u主机
格式不仅仅是主机公钥的副本。
已知的\u主机
可以有多行,每行都是主机名和/或地址,后跟算法和blob(有效地)从该主机的
.pub
文件复制。@dave_thompson_085-感谢您的回复。没有已知的_hosts文件,因此我尝试使用服务器ssh_host_rsa_密钥文件的内容创建一个。我只是想弄清楚如何进行手动连接并重新显示主机密钥消息。
     String knownHostPublicKey = "";
     String readLine = "";
     BufferedReader fr = new BufferedReader(new 
            FileReader("C:\\Users\\.ssh\\ssh_host_rsa_key.pub"));
    while((readLine = fr.readLine()) != null){
        knownHostPublicKey = readLine;
        System.out.println(knownHostPublicKey);
    }

  //  jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

    session.connect();