server.xml 如何为 Maven SSH 使用提供主机密钥
How to provide Host Key for Maven SSH usage in server.xml
在 Maven settings.xml
中,我想定义一个 SSH 服务器并提供:
- 要连接的主机
- 要连接的用户
- 私钥的位置(用于验证我自己)
- 手动提供主机密钥(public 验证服务器的密钥)
我不想:
- 依赖于
~/.ssh/known_hosts
文件
- 要求接受主机密钥
- 忽略主机密钥验证
因此,StackExchange 上的现有答案对我没有帮助,其中包括:
- Overridding the provider to the
NullKnownHostProvider
and setting hostKeyChecking
to no
.
- Manually executing ssh on the command line to get the hostkey entered in the
~/.ssh/known_hosts
file.
这是我设想如何在 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>
这是一个常见问题,您可以在 Internet 上找到许多人寻找正确的解决方案,他们试图用 SingleKnownHostsProvider
的实例覆盖 knownHostsProvider
实现,正如您在例如。
首先,这就是为什么这样做并不容易:
当存储库 URL 以 scp:
开头时,Maven 使用的组件管理器 Plexus 查找具有角色 org.apache.maven.wagon.Wagon
和提示 scp
的组件,并且在当前的 Wagon 实现(至少达到 3.0.1)中找到唯一符合这些需求的,即 class org.apache.maven.wagon.providers.ssh.jsch.ScpWagon
。 class 在同一个包中扩展了 class AbstractJschWagon
,而 后者 class 静态定义了一个 file
角色提示到 select一个KnownHostProvider
实例。
因此,此 file
角色提示使 Plexus 使用 class FileKnownHostsProvider
来实例化一个 KnownHostsProvider
对象,该对象被赋予 ScpWagon
实例.这是因为 class FileKnownHostsProvider
在其源文件的开头定义如下:
public class FileKnownHostsProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="file"
相反,class SingleKnownHostProvider
不是 定义角色提示 file
但角色提示 single
:
public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="single"
因此,绑定到这个不需要的(在您的情况下)FileKnownHostsProvider
是在 AbstractJschWagon
源文件中静态定义的。这就是全部难度。
现在,解决问题的方法如下:
使用此 Maven wagon 修补实施 available here on GitHub,通过 运行 这些步骤:
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 Central 上不可用,但在 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 将不会显示密钥指纹,也不会要求你验证这个主机密钥。
希望对您有所帮助。
在 Maven settings.xml
中,我想定义一个 SSH 服务器并提供:
- 要连接的主机
- 要连接的用户
- 私钥的位置(用于验证我自己)
- 手动提供主机密钥(public 验证服务器的密钥)
我不想:
- 依赖于
~/.ssh/known_hosts
文件 - 要求接受主机密钥
- 忽略主机密钥验证
因此,StackExchange 上的现有答案对我没有帮助,其中包括:
- Overridding the provider to the
NullKnownHostProvider
and settinghostKeyChecking
tono
. - Manually executing ssh on the command line to get the hostkey entered in the
~/.ssh/known_hosts
file.
这是我设想如何在 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>
这是一个常见问题,您可以在 Internet 上找到许多人寻找正确的解决方案,他们试图用 SingleKnownHostsProvider
的实例覆盖 knownHostsProvider
实现,正如您在例如。
首先,这就是为什么这样做并不容易:
当存储库 URL 以 scp:
开头时,Maven 使用的组件管理器 Plexus 查找具有角色 org.apache.maven.wagon.Wagon
和提示 scp
的组件,并且在当前的 Wagon 实现(至少达到 3.0.1)中找到唯一符合这些需求的,即 class org.apache.maven.wagon.providers.ssh.jsch.ScpWagon
。 class 在同一个包中扩展了 class AbstractJschWagon
,而 后者 class 静态定义了一个 file
角色提示到 select一个KnownHostProvider
实例。
因此,此 file
角色提示使 Plexus 使用 class FileKnownHostsProvider
来实例化一个 KnownHostsProvider
对象,该对象被赋予 ScpWagon
实例.这是因为 class FileKnownHostsProvider
在其源文件的开头定义如下:
public class FileKnownHostsProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="file"
相反,class SingleKnownHostProvider
不是 定义角色提示 file
但角色提示 single
:
public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="single"
因此,绑定到这个不需要的(在您的情况下)FileKnownHostsProvider
是在 AbstractJschWagon
源文件中静态定义的。这就是全部难度。
现在,解决问题的方法如下:
使用此 Maven wagon 修补实施 available here on GitHub,通过 运行 这些步骤:
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 Central 上不可用,但在 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 将不会显示密钥指纹,也不会要求你验证这个主机密钥。
希望对您有所帮助。