我的问题类似于这里提出的问题: Ant scp task failure
BUILD FAILED 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
”。是的,这可以使任务正常运行,但不能不对安全性视而不见。
答案 0 :(得分: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,或者下载现成的jar。我解压缩了zip下载,然后将jar文件放在同一个目录中。
包含examples
的{{1}}文件夹。您需要编译该文件然后运行它 - 它会询问您的known_hosts文件(只需先在默认位置创建一个空文件(KnownHosts.java
)并选择它。然后它将询问您是否有详细信息要连接到服务器...输入那些,例如~/.ssh/known_hosts
,程序将尝试连接,然后为您填写known_hosts文件。
为了方便让像我一样的Windows用户无法记住如何从命令行执行操作,这就是编译和运行sshusername@xx.xx.xx.xx
文件所需的内容:
首先,导航到目录(解压缩并将jar文件放入其中,如上所述)。
然后运行:
KnownHosts.java
编译KnownHosts.java。然后:
javac -cp jsch-0.1.49.jar examples/KnownHosts.java
运行它。按照上面的说明操作,你应该有一个工作的known_hosts文件。
最后一点说明:KnownHosts程序假定端口为22.我编辑它以允许我输入类似java -cp "examples;jsch-0.1.49.jar" KnownHosts
的内容,这样我就可以指定一个带有自定义端口的服务器并让它按上述方式工作。在KnownHosts.java的源代码中,我查找了一行:
sshusername@xx.xx.xx.xx:8888
并将其替换为:
Session session=jsch.getSession(user, host, 22);
然后编译并运行如上。
答案 1 :(得分:1)
sshexec ant任务正在寻找文件' known_hosts'默认为$ {user.home} /.ssh / known_hosts
验证' user.home'的价值。系统属性。可能它指向了不可思议的地方。 或者提供“已知主人”'值明确地定义在ant任务的属性中。
答案 2 :(得分: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}"/>
[...]