Maven Wagon SCP无法建立连接

问题描述:

我试图将资源复制到另一个位置。我使用maven wagon-ssh插件来执行此操作。它在当地很好,我在使用Hudson/Jenkins时遇到了问题。Maven Wagon SCP无法建立连接

settings.xml文件看起来像这样:

<servers> 
    <server> 
     <id>iq</id> 
     <configuration> 
      <knownHostsProvider implementation="org.apache.maven.wagon.providers.ssh.knownhost.NullKnownHostProvider"> 
       <hostKeyChecking>no</hostKeyChecking> 
      </knownHostsProvider> 
     </configuration> 
     <username>user</username> 
     <password>pass</password> 
    </server> 
</servers> 

我想this answer to skipping checking因为我得到:

Are you sure you want to continue connecting? (yes/no): The authenticity of host 'address' can't be established. 
RSA key fingerprint is 10:.......:bb. 

,但现在我得到:

Could not apply configuration for iq to wagon org.apache.maven.wagon.providers.ssh.jsch.ScpWagon:ClassNotFoundException: Class name which was explicitly given in configuration using 'implementation' attribute: 'org.apache.maven.wagon.providers.ssh.knownhost.NullKnownHostProvider' cannot be loaded 
org.codehaus.plexus.component.configurator.ComponentConfigurationException: ClassNotFoundException: Class name which was explicitly given in configuration using 'implementation' attribute: 'org.apache.maven.wagon.providers.ssh.knownhost.NullKnownHostProvider' cannot be loaded 
    at org.codehaus.plexus.component.configurator.converters.AbstractConfigurationConverter.getClassForImplementationHint(AbstractConfigurationConverter.java:70) 
    at ..... 

Caused by: java.lang.ClassNotFoundException: org.apache.maven.wagon.providers.ssh.knownhost.NullKnownHostProvider 
    at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) 
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244) 
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230) 
    at org.codehaus.plexus.component.configurator.converters.AbstractConfigurationConverter.getClassForImplementationHint(AbstractConfigurationConverter.java:61) 
    ... 37 more 
The authenticity of host 'address' can't be established. 
RSA key fingerprint is 10:.......:bb. 
Are you sure you want to continue connecting? (yes/no): The authenticity of host 'address' can't be established. 

您确定要继续连接吗? (是/否):主机'地址'的真实性无法建立。 RSA密钥指纹为10:.......:bb。

是的,这也发生在我们身上。你似乎已经解决了你的问题,但我想我会为后人添加更多细节。

在Jenkins下运行时,没有控制台,因此没有人确认任何新的ssh密钥或maven服务器的密钥更改。为了解决这个问题,我们以jenkins用户的身份登录到我们的jenkins框,并从命令行手动执行工作区目录中的作业。这会将相应的行添加到jenkins用户的ssh配置文件中。

键入“是”一堆时间似乎增加了知名主机文件的关键并解决了问题,虽然您将需要重新启动作业以确保。

此外,我还没有尝试过,但您可以将以下内容添加到~jenkins/.ssh/config。见:How to Avoid Maven builds stall on ssh host authenticity problem?

StrictHostKeyChecking no 

希望这可以帮助别人。

的问题是, RSA密钥未交换。

所以我做的是,我连接命令行的两台服务器。因此RSA密钥被存储并且

Are you sure you want to continue connecting? (yes/no): The authenticity of host 'address' can't be established. 
RSA key fingerprint is 10:.......:bb. 

此消息停止。它现在完美运行

+0

如果它适合你,你可以接受你自己的答案。 – ArtB

+0

谢谢@ArtB。我忘了那个 –

+0

@Gray我正在通过jenkins执行它,所以按下输入不会有帮助:) –

maven显然需要一个ssh-rsa条目。您可以通过发行获得支持SSH-RSA进入

SSH-键扫描-t RSA YOUR_REMOTE_HOSTNAME >>的〜/ .ssh/known_hosts中

+0

你是我的救星 – TheCodeKiller

这是我们用来填充的known_hosts詹金斯节点上的文件:

<plugin> 
    <groupId>org.codehaus.groovy.maven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>check-known-hosts</id> 
      <phase>initialize</phase> 
      <goals> 
      <goal>execute</goal> 
      </goals> 
      <configuration> 
      <source> 
       import com.jcraft.jsch.*; 
       import org.apache.maven.wagon.providers.ssh.knownhost.*; 

       def keyString = "<REPLACE_WITH_HOST_KEY>" // host key - the line from known_hosts after key type (ssh-rsa) 

       FileKnownHostsProvider fkhp = new FileKnownHostsProvider(); 

       JSch sch = new JSch(); 
       sch.setKnownHosts(new ByteArrayInputStream(fkhp.getContents().getBytes())); 

       def host = project.properties.serverAddress // define <serverAddress>someserveraddress.com</serverAddress> in <properties> 

       if (host != null) { 
        HostKeyRepository hkr = sch.getHostKeyRepository(); 
        HostKey[] hk = hkr.getHostKey(host , null); 

        StringWriter stringWriter = new StringWriter(); 

        String knownHost = host + " " + "ssh-rsa" + " " + keyString; 

        if (hk != null) 
        { 

        PrintWriter w = new PrintWriter(stringWriter) 
        def containsKey = false; 
        for (HostKey key : hk) 
        { 
         def toAdd = key.getHost() + " " + key.getType() + " " + key.getKey(); 
         w.println(toAdd) ; 
         containsKey = knownHost.equals(toAdd); 
        } 
        if (!containsKey) { 
         println "Adding key for " + host + " to known_hosts" 
         w.println(knownHost); 
         fkhp.storeKnownHosts(stringWriter.toString()); 
        } else { 
         println "Key for " + host + " is already present in known_hosts" 
        } 
        } 
       } 
      </source> 
      </configuration> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
     <groupId>org.apache.maven.wagon</groupId> 
     <artifactId>wagon-ssh-common</artifactId> 
     <version>2.10</version> 
     </dependency> 
     <dependency> 
     <groupId>com.jcraft</groupId> 
     <artifactId>jsch</artifactId> 
     <version>0.1.54</version> 
     </dependency> 
    </dependencies> 
    </plugin> 

似乎工作得很好。