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 delSYSTEM
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).