java git ssh jsch jgit

java - Configurando known_hosts en jgit



ssh jsch (1)

Usando jgit con gitolite para el control de fuente, tengo una aplicación que genera cierto código en el comando y que queremos comprometer con el control de fuente. El objetivo es tirar con un avance rápido, confirmar el nuevo código y luego presionarlo.

Tengo el siguiente método:

private void commitToGitRepository(String updateComment, Config config) throws IOException, NoFilepatternException, GitAPIException { if(git == null) { git = Git.open(new File(config.getDpuCheckoutDir())); } PullCommand pull = git.pull(); pull.call(); }

Este método falla en la llamada al método pull.call() , con la siguiente excepción:

com.jcraft.jsch.JSchException: UnknownHostKey: www.somehost.com. RSA key fingerprint is 9d:92:a9:c5:5d:cb:5f:dc:57:ff:38:7e:34:31:fe:75 at com.jcraft.jsch.Session.checkHost(Session.java:748) at com.jcraft.jsch.Session.connect(Session.java:319) at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:116) at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:121) at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:248) at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:147) at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136) at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122) at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1104) at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128) at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:245) at net.intellidata.dpu.controller.schema.EntityMappingController.commitToGitRepository(EntityMappingController.java:149) ... (truncated where it meets my code)

La forma en que leo esto, parece que no está encontrando mi archivo known_hosts en user_home/.git . Sin embargo, he estado buscando durante una hora y no encuentro una forma de configurar JGit para decirle a JSch dónde buscar el archivo known_hosts.

Sugerencias? Sé que la entrada para el origen está presente en mi archivo known_hosts


Esta respuesta menciona:

jsch.setKnownHosts("C://Users//aUsername//known_hosts");

Pero está utilizando jgit, y no jsch (el shell seguro de Java) directamente, así que veamos:

C:/Users/VonC/prog/git>git clone https://github.com/eclipse/jgit Cloning into ''jgit''... remote: Counting objects: 37854, done. remote: Compressing objects: 100% (7743/7743), done. remote: Total 37854 (delta 22009), reused 34367 (delta 18831) Receiving objects: 100% (37854/37854), 6.73 MiB | 1.37 MiB/s, done. Resolving deltas: 100% (22009/22009), done. C:/Users/VonC/prog/git>cd jgit C:/Users/VonC/prog/git/jgit>grep -nrHI "setKnownHosts" * org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java:262: sch.setKnownHosts(in);

¡Lo encontré!

Esto proviene de JschConfigSessionFactory.java#knownHosts() y se ve así:

new File(new File(home, ".ssh"), "known_hosts"); # with: home = fs.userHome();

userHome se basa en System.getProperty ("user.home") .

Así que asegúrese de que su sesión java tenga un user.home definido , y que tenga un archivo %USERPROFILE%/.ssh/known_hosts allí.

( user.home debe establecerse en java en %USERPROFILE% para Windows, es decir, si está en Windows: en algunos casos, esto no siempre funcionará ).

Ahora bien, si tiene un %USERPROFILE%/.ssh/known_hosts , entonces, como se menciona aquí

Solo SSH para el cliente (usando la herramienta ssh línea de comandos), esto agregará una entrada a su ~/.ssh/known_hosts file .

En este caso, StormeHawke menciona en los comentarios :

como estoy ejecutando esto en Tomcat como un servicio de Windows , Jsch (y por extensión JGit) no buscaba en mi carpeta de usuario sino en la carpeta de inicio de la cuenta SYSTEM para la carpeta .ssh .
En este caso, seguí y copié la carpeta .ssh en la carpeta de inicio del SYSTEM ya que Tomcat solo se ejecuta en mi máquina para fines de desarrollo y prueba (probablemente no sea la mejor política de seguridad, pero el riesgo es mínimo en este caso).

A partir de esta pregunta , este , ese directorio para la Cuenta LocalSystem debería ser:

C:/Documents and Settings/Default User # or Wind7 / 2008 C:/Windows/System32/Config/systemprofile

El OP menciona:

De acuerdo con esta llamada:

System.out.println(System.getProperty("user.home"));

el directorio inicial del SYSTEM predeterminado para Windows 7 (y presumiblemente cualquier otro sistema Windows basado en NT) es simplemente C:/ .
(Así que no es ideal, pero para una solución rápida, funciona).