Как да предоставите ключ на хост за използване на Maven SSH в server.xml

В Maven settings.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>

person YoYo    schedule 31.07.2015    source източник


Отговори (1)


Това е често срещан проблем, можете да намерите много хора в интернет, които търсят правилно решение, опитвайки се да заменят изпълнението knownHostsProvider с екземпляр на SingleKnownHostsProvider, както обяснихте във вашия пример.

Първо, ето защо не е толкова лесно да направите това:

Когато URL адресът на хранилището започва с scp:, Plexus, мениджърът на компоненти, използван от Maven, търси компонент с роля org.apache.maven.wagon.Wagon и намек 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 е не дефиниран с подсказка за роля file, а с подсказка за роля single:

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

Така че обвързването към този нежелан (във вашата ситуация) FileKnownHostsProvider е статично дефинирано в изходния файл AbstractJschWagon. Това е цялата трудноста

Ето как да разрешите проблема:

Използвайте тази реализация на Maven wagon, достъпна тук в 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 няма да покаже отпечатъка на ключа, нито ще ви помоли да потвърдите този ключ на хост.

Надявам се това да помогне.

person Alexandre Fenyo    schedule 18.08.2017
comment
Много хубаво и чисто решение. Ще се радвам да го видя обединено с официалното изпълнение. Свързахте ли се с официалните поддържащи? - person YoYo; 24.08.2017
comment
Все още не съм ги предложил, но ще го направя. Благодаря. - person Alexandre Fenyo; 24.08.2017