【问题标题】:knownhosts for Ant scp and sshexec tasksAnt scp 和 sshexec 任务的 knownhosts
【发布时间】:2012-10-16 06:01:58
【问题描述】:

我的问题与此处提出的问题类似: Ant scp task failure

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

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

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

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”。是的,这可以让任务发挥作用,但并非对安全性视而不见。

【问题讨论】:

  • 我正在努力解决完全相同的问题。我有一个 known_hosts 文件,该文件适用于早期版本的 Ant(或更高版本,将早期版本的 Jsch 库放在 lib 文件夹中),但我还无法弄清楚更高版本的具体内容在 known_hosts 文件或 knownhosts 目录或其他任何地方。
  • 最后我想通了:) 请看下面的答案。

标签: ant ssh build-automation jsch


【解决方案1】:

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

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

【讨论】:

  • 文件存在且路径正确。我也明确地尝试了 knownhosts 值。
【解决方案2】:

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

  • 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}"/>
[...]

【讨论】:

  • 你确定这行得通吗? ${user.home/.ssh/knownhosts 这个好像左大括号'}'
【解决方案3】:

这是我发现的一种适用于更新版本的 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 文件放到了同一目录中。

有一个包含KnownHosts.java 的examples 文件夹。您需要编译该文件然后运行它 - 它会询问您的 known_hosts 文件(只需先在默认位置 (~/.ssh/known_hosts) 创建一个空文件并选择它。然后它会询问您连接到server... 输入这些,例如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);

然后编译运行如上。

【讨论】:

  • 这就解释了为什么它对我尝试过的任何东西都不起作用。它们使用的格式与 OpenSSH 使用的格式不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2023-03-09
  • 2014-10-19
  • 2011-02-19
  • 2010-12-05
  • 2011-11-17
  • 1970-01-01
相关资源
最近更新 更多