5

我的问题类似于这里问的问题: Ant scp task failure

构建失败 com.jcraft.jsch.JSchException: 拒绝 HostKey: ....

我的问题是为什么在我的 knownhosts 文件中找不到密钥?

无论我拥有什么样的 known_hosts 文件,主机密钥都会被拒绝。通过 ssh 连接可以正常工作,并添加相关条目,但可能jsch无法读取known_hostsOpenSSH 生成的文件?

Ant 文档提到 knownhosts 文件需要是 SSH2 格式,而不是 SSH1。具有讽刺意味的是,来自 OpenSSH 的 SSH2 格式 known_hosts 文件应该是~/.ssh/known_hosts2,但 knownhosts 的默认值是~/.ssh/known_hosts.

由 SSH2 创建的已知主机文件位于 中~/.ssh2/knownhosts/,因此将其排除在预期格式之外可能是安全的。到目前为止,我一直无法让 OpenSSH 创建known_hosts2文件,并且手册页在那里也没有太大帮助。那么文档实际上意味着文件需要采用 SSH2 格式是什么意思?

我已经尝试过dsa密钥rsa,但都不起作用(都可以使用 OpenSSH)。

我已经搜索了两天,我找到的唯一答案是' set trust="true'。是的,这可以使任务发挥作用,但并非对安全性视而不见。

4

3 回答 3

2

这是我发现的一种适用于更新版本的 jch 的格式:

[xx.xx.xx.xx]:22 ssh-rsa .......

在旧版本中,它就像:

xx.xx.xx.xx ssh-rsa ......

即没有方括号,也没有端口号。(如果您使用端口 22,不确定是否需要端口号,但我使用分配给 SSH 的非默认端口的服务器对其进行了测试。并且,如果不明显,xx.xx.xx.xx应该是服务器的 IP 地址,或主机名或其他任何东西。)

我通过让 JCraft/jsch 库为我生成 known_hosts 文件找到了这种格式。如果您访问www.jcraft.com,您可以下载 jsch 源代码的 zip 文件和一些示例。要么构建源代码来制作 jar,要么下载现成的 jar。我解压缩了 zip 下载文件,然后将 jar 文件放在同一个目录中。

有一个examples文件夹包含KnownHosts.java. 您需要编译该文件然后运行它 - 它会询问您的 known_hosts 文件(只需先在默认位置(~/.ssh/known_hosts)创建一个空文件并选择它。然后它会询问您连接到服务器的详细信息.. . 输入这些,例如sshusername@xx.xx.xx.xx,程序将尝试连接,然后为您填写 known_hosts 文件。

为了方便像我这样不记得如何从命令行执行操作的 Windows 用户,这里是编译和运行该KnownHosts.java文件所需的内容:

首先,导航到目录(已解压缩并将 jar 文件放入其中,如上所述)。

然后运行:

javac -cp jsch-0.1.49.jar examples/KnownHosts.java

编译 KnownHosts.java。接着:

java -cp "examples;jsch-0.1.49.jar" KnownHosts

运行它。按照上面的说明操作,您应该有一个工作的 known_hosts 文件。

最后一点:KnownHosts 程序假定端口为 22。我对其进行了编辑以允许我输入类似的内容,sshusername@xx.xx.xx.xx:8888以便我可以指定具有自定义端口的服务器并使其按上述方式工作。在 KnownHosts.java 的源代码中,我查找了如下行:

Session session=jsch.getSession(user, host, 22);

并将其替换为:

int port = 22;
final int colonIndex = host.indexOf(':');
if (colonIndex > -1) {
    final String[] split = host.split(":");
    host = split[0];
    port = Integer.parseInt(split[1]);
}
Session session=jsch.getSession(user, host, port);

然后编译并运行如上。

于 2013-02-22T19:03:21.113 回答
1

sshexec ant 任务默认在 ${user.home}/.ssh/known_hosts 中查找文件“known_hosts”

验证“user.home”系统属性的值。可能它指向了意想不到的地方。或者在 ant 任务的属性中明确提供“knownhosts”值。

于 2012-12-21T17:16:58.123 回答
0

您可能对以下两个参数感兴趣:

  • trust:如果设置为true将信任未知主机。默认设置为false
  • knownhosts:设置为已知主机文件的位置。

第一个将允许您将任务设置为不检查它是否是已知主机。第二个将允许您指定包含已知主机的文件。这样,您可以将其指定为${user.home}/.ssh/known_hosts2并覆盖默认值。

顺便说一句,这样做的一个好方法是使用这些值的属性,然后使用属性文件来覆盖这些属性:

[...]
<property name="build.properties" value="build.properties"/>
<property file="${build.properties}"/>

<!-- Can be overridden via 'build.properies' file -->
<property name="knownhosts.file" value="${user.home}/.ssh/knownhosts"/>

<property name="remote.host" value="foo-system"/>
[...]

    <scp file="${copy.this.file}"
       todir="${user}@{host}:${remote.dir}"
       knownhosts="${knownhosts.file}"/>
[...]
于 2012-12-21T17:52:32.003 回答