2011-11-30 125 views
3

我試圖將資源複製到另一個位置。我使用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. 

回答

1

您確定要繼續連接嗎? (是/否):主機'地址'的真實性無法建立。 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 

希望這可以幫助別人。

2

的問題是, 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執行它,所以按下輸入不會有幫助:) –

9

maven顯然需要一個ssh-rsa條目。您可以通過發行獲得支持SSH-RSA進入

SSH-鍵掃描-t RSA YOUR_REMOTE_HOSTNAME >>的〜/ .ssh/known_hosts中

+0

你是我的救星 – TheCodeKiller

0

這是我們用來填充的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> 

似乎工作得很好。