11

在 Mavensettings.xml中,我想定义一个 SSH 服务器并提供:

  • 要连接的主机
  • 要连接的用户
  • 私钥的位置(用于验证我自己)
  • 手动提供主机密钥(验证服务器的公钥)

我不想:

  • 依赖于~/.ssh/known_hosts文件
  • 被要求接受主机密钥
  • 忽略主机密钥验证

因此,StackExchange 上的现有答案对我没有帮助,其中包括:

这是我设想的如何在 maven 中设置的示例setup.xml

<servers>
  <server>
    <id>gitcloud.myserver.net:8001</id>
    <username>git</username>
    <privateKey>C:/data/home/.ssh/id_rsa</privateKey>
    <configuration>
      <knownHostsProvider implementation="org.apache.maven.wagon.providers.ssh.knownhost.SingleKnownHostProvider">
        <hostKeyChecking>yes</hostKeyChecking>
        <contents>codecloud.web.att.com ssh-rsa XXXXA3NvvFakeSSHKEYsdfADA...doLQ==</contents>
      </knownHostsProvider>
    </configuration>
  </server>
</servers>
4

1 回答 1

4

这是一个常见问题,您可以在 Internet 上找到许多人在寻找正确的解决方案,并尝试knownHostsProvider使用 的实例来覆盖实现SingleKnownHostsProvider,正如您在示例中所解释的那样。

首先,这就是为什么这样做并不容易:

当存储库 URL 以 开头时scp:,Maven 使用的组件管理器 Plexus 会查找具有 roleorg.apache.maven.wagon.Wagon和 hint的组件scp,并在当前 Wagon 实现中找到唯一符合这些需求的组件(至少到 3.0.1),那是一流的org.apache.maven.wagon.providers.ssh.jsch.ScpWagon。这个类扩展了AbstractJschWagon同一个包中的类,后一个类静态定义了一个file角色提示来选择一个KnownHostProvider实例。

因此,此file角色提示使 Plexus 使用该类FileKnownHostsProvider来实例化提供给实例的KnownHostsProvider对象ScpWagon。这是因为该类FileKnownHostsProvider在其源文件的开头以下列方式定义:

public class FileKnownHostsProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
*    role-hint="file"

相反,类SingleKnownHostProvider不是用 role-hint 定义的,而是file用 role-hint定义的single

public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
*    role-hint="single"

因此,对这个不需要的(在您的情况下)的绑定是在源文件FileKnownHostsProvider中静态定义的。AbstractJschWagon这就是全部的困难。

现在,这是解决问题的方法:

通过运行以下步骤,使用 GitHub 上可用的这个 Maven wagon 修补实现:

1- 在您的 中pom.xml,您可能以这种方式定义了一些 Maven 扩展:

<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>3.0.1</version>
    </extension>
  </extensions>
</build>

请注意,您可以使用 3.0.1 以外的其他版本。

无论如何,通过特定版本 3.0.1-SINGLE 更改此定义:

<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>3.0.1-SINGLE</version>
    </extension>
  </extensions>
</build>

2-这个特定版本3.0.1-SINGLE是我为解决这个非常常见的问题而修补的Wagon版本,我也遇到过。它在 Maven 中心不可用,但在 GitHub 上可用。

因此,您必须自己安装它,例如以下方式:

% git clone https://github.com/AlexandreFenyo/maven-wagon.git
% cd maven-wagon
% mvn install

3-现在,setup.xml以这种方式配置您的:

<servers>
  <server>
    <id>gitcloud.myserver.net:8001</id>
    <username>git</username>
    <privateKey>C:/data/home/.ssh/id_rsa</privateKey>
    <configuration>
      <hostKey>codecloud.web.att.com ssh-rsa XXXXA3NvvFakeSSHKEYsdfADA...doLQ==</hostKey>
    </configuration>
  </server>
</servers>

现在一切都应该如您所愿:如果setup.xml文件中定义的主机密钥是正确的,maven 将不会显示密钥指纹,也不会要求您验证此主机密钥。

希望有帮助。

于 2017-08-18T17:53:16.543 回答