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