2015-07-31 25 views
9

Nel Maven settings.xml, voglio definire un server SSH e fornire:Come fornire tasto Host per l'utilizzo Maven SSH in server.xml

  • The Host per la connessione a
  • L'utente per la connessione a
  • la posizione di una chiave privata (per autenticare me)
  • fornire manualmente una chiave host (chiave pubblica per verificare il server)

Non voglio:

  • dipendere dalla ~/.ssh/known_hosts file di
  • essere chiesto di accettare una serie chiave
  • di ignorare la convalida chiave host

Come tale, le risposte esistenti StackExchange non mi aiuta, tra cui:

Questo è un esempio di come ho immaginato che potrebbe essere messa a punto nel 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> 

risposta

3

Questo è un problema comune, si possono trovare molte persone su Internet alla ricerca di una soluzione giusta, cercando di ignorare l'implementazione knownHostsProvider con un'istanza di SingleKnownHostsProvider, come spiegato nell'esempio.

In primo luogo, qui è il motivo per cui non è così facile da fare che:

Quando l'URL del repository inizia con scp:, Plexus, il manager componente utilizzato da Maven, sembra per un componente con il ruolo org.apache.maven.wagon.Wagon e suggerire scp e trova l'unico che risponda a queste esigenze nell'attuale implementazione di Wagon (almeno fino a 3.0.1), ovvero della classe org.apache.maven.wagon.providers.ssh.jsch.ScpWagon. Questa classe estende la classe AbstractJschWagon nello stesso pacchetto e quest'ultima classe definisce staticamente un suggerimento di ruolo file per selezionare un'istanza KnownHostProvider.

Pertanto, questo file ruolo-suggerimento rende plesso utilizzare la classe di FileKnownHostsProvider instanciate un oggetto KnownHostsProvider che viene dato all'istanza ScpWagon.Questo è perché la classe FileKnownHostsProvider è definita nel seguente modo all'inizio del suo file sorgente:

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

Al contrario, la classe SingleKnownHostProvider è non definito con il ruolo-suggerimento file ma con ruolo-suggerimento single:

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

Quindi, il legame a questa indesiderata (nella vostra situazione) FileKnownHostsProvider è staticamente definito nel file AbstractJschWagon sorgente. Questa è l'intera difficoltà.

Ora, ecco come risolvere il problema:

Utilizzare questa Maven carro patchato implementazione available here on GitHub, eseguendo questi passaggi:

1- nel vostro pom.xml, si può avere qualche estensione Maven definito in questo modo:

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

Nota che è possibile utilizzare un'altra versione rispetto alla 3.0.1.

In ogni caso, cambiare questa definizione con la versione specifica 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- Questa specifica versione 3.0.1-SINGLE è una versione Wagon ho patchato per risolvere questo problema molto comune, ho anche incontrato. Non è disponibile su Maven central, ma su GitHub.

Quindi, è necessario installare da soli, come segue, per esempio:

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

3- Ora, configurare il setup.xml in questo modo:

<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> 

tutto dovrebbe ora funzionare come si vuole: se la chiave host definita nel file setup.xml è corretta, Maven non visualizzerà l'impronta digitale della chiave, né chiederà di convalidare questa chiave host.

Spero che questo aiuti.

+1

Soluzione molto bella e pulita. Mi piacerebbe vederlo fuso con l'implementazione ufficiale. Hai contattato i manutentori ufficiali? – YoYo

+1

Non li ho ancora suggeriti, ma lo farò. Grazie. –