下面列出了怎么用org.eclipse.jgit.transport.JschConfigSessionFactory的API类实例代码及写法,或者点击链接到github查看源代码。
private static List<String> getPublicKeys() throws Exception {
return new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
}
List<String> getPublicKeys() throws Exception {
JSch jSch = createDefaultJSch(FS.DETECTED);
List<String> keys = new ArrayList<>();
for (Object o : jSch.getIdentityRepository().getIdentities()) {
Identity i = (Identity) o;
KeyPair keyPair = KeyPair.load(jSch, i.getName(), null);
StringBuilder sb = new StringBuilder();
try (StringBuilderWriter sbw = new StringBuilderWriter(sb);
OutputStream os = new WriterOutputStream(sbw, "UTF-8")) {
keyPair.writePublicKey(os, keyPair.getPublicKeyComment());
} finally {
keyPair.dispose();
}
keys.add(sb.toString().trim());
}
return keys;
}
}.getPublicKeys();
}
public SshSessionFactory getSshSessionFactory(String privateKey, final Path tempKey) {
try {
Files.write(tempKey, privateKey.getBytes());
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch defaultJSch = new JSch();
defaultJSch.addIdentity(tempKey.toAbsolutePath().toString());
return defaultJSch;
}
};
return sshSessionFactory;
} catch (IOException e) {
logger.error("Failed to create private key for SSH connection.", e);
}
return null;
}
private SshSessionFactory getSshSessionFactory(String privateKey, final Path tempKey) {
try {
Files.write(tempKey, privateKey.getBytes());
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch defaultJSch = new JSch();
defaultJSch.addIdentity(tempKey.toAbsolutePath().toString());
return defaultJSch;
}
};
return sshSessionFactory;
} catch (IOException e) {
logger.error("Failed to create private key for SSH connection.", e);
}
return null;
}
private SshSessionFactory getSshSessionFactory(String remotePrivateKey, final Path tempKey) {
try {
Files.write(tempKey, remotePrivateKey.getBytes());
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch defaultJSch = super.createDefaultJSch(fs);
defaultJSch.addIdentity(tempKey.toAbsolutePath().toString());
return defaultJSch;
}
};
return sshSessionFactory;
} catch (IOException e) {
logger.error("Failed to create private key for SSH connection.", e);
}
return null;
}
public static void main(String[] args) throws GitAPIException {
Git.cloneRepository()
.setURI("[email protected]:jiangzeyin/test.git")
.setDirectory(new File("D:\\test\\gitssh"))
.setTransportConfigCallback(new TransportConfigCallback() {
@Override
public void configure(Transport transport) {
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("");
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch defaultJSch = super.createDefaultJSch(fs);
defaultJSch.addIdentity("C:\\Users\\Colorful\\.ssh\\id_rsa.pub");
return defaultJSch;
}
});
}
})
.call();
}
protected final void configureJsch(final Log log) {
if (!disableSshAgent) {
if (serverId != null) {
final Server server = settings.getServer(serverId);
if (server != null) {
privateKey = privateKey == null ? server.getPrivateKey() : privateKey;
passphrase = passphrase == null ? server.getPassphrase() : passphrase;
} else {
log.warn(format("No server configuration in Maven settings found with id %s", serverId));
}
}
JschConfigSessionFactory.setInstance(new SshAgentSessionFactory(log, knownHosts, privateKey, passphrase));
}
}
@Before
public void setup() {
when(server.getPrivateKey()).thenReturn(SETTINGS_IDENTITY_FILE);
when(server.getPassphrase()).thenReturn(SETTINGS_PASSPHRASE);
when(settings.getServer(SERVER_ID)).thenReturn(server);
mojo.setSettings(settings);
JschConfigSessionFactory.setInstance(null);
}
@Test
public void configureJsch_SshAgentDisabled() {
mojo.disableSshAgent();
mojo.configureJsch(log);
assertEquals("org.eclipse.jgit.transport.DefaultSshSessionFactory",
JschConfigSessionFactory.getInstance().getClass().getName());
}
@Test
public void configureJsch_CustomKnownHosts() {
mojo.setKnownHosts(KNOWN_HOSTS);
mojo.configureJsch(log);
final SshAgentSessionFactory factory = (SshAgentSessionFactory) JschConfigSessionFactory.getInstance();
assertEquals(KNOWN_HOSTS, factory.getKnownHostsOrNull());
}
private SshSessionFactory getSshSessionFactory() {
JschConfigSessionFactory sessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
if (!GitMonitoringService.this.strictHostKeyCheckingEnabled) {
session.setConfig("StrictHostKeyChecking", "no");
}
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
if (GitMonitoringService.this.isJschLoggerEnabled) {
JSch.setLogger(new JschLogger());
}
JSch defaultJSch = super.createDefaultJSch(fs);
defaultJSch.getIdentityRepository().removeAll();
if (GitMonitoringService.this.privateKeyPath != null) {
defaultJSch.addIdentity(GitMonitoringService.this.privateKeyPath, GitMonitoringService.this.passphrase);
} else {
defaultJSch.addIdentity("gaas-git", GitMonitoringService.this.privateKey, null,
GitMonitoringService.this.passphrase.getBytes(Charset.forName("UTF-8")));
}
if (!Strings.isNullOrEmpty(GitMonitoringService.this.knownHosts)) {
defaultJSch.setKnownHosts(new ByteArrayInputStream(GitMonitoringService.this.knownHosts.getBytes(Charset.forName("UTF-8"))));
} else if (!Strings.isNullOrEmpty(GitMonitoringService.this.knownHostsFile)) {
defaultJSch.setKnownHosts(GitMonitoringService.this.knownHostsFile);
}
return defaultJSch;
}
};
return sessionFactory;
}
public static void gitSync() throws IOException, InvalidRemoteException, org.eclipse.jgit.api.errors.TransportException, GitAPIException {
SshSessionFactory.setInstance(new JschConfigSessionFactory() {
public void configure(Host hc, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
};
}
);
if (openRepository()) {
pullRepository();
}
else cloneRepository();
}
private void initialize() {
if (!this.initialized) {
SshSessionFactory.setInstance(new JschConfigSessionFactory() {
@Override
protected void configure(Host hc, Session session) {
session.setConfig("StrictHostKeyChecking",
isStrictHostKeyChecking() ? "yes" : "no");
}
});
this.initialized = true;
}
}
@Override
public void configure(Transport transport) {
SshSessionFactory.setInstance(new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
session.setConfig("StrictHostKeyChecking",
FileBasedSshTransportConfigCallback.this.sshUriProperties
.isStrictHostKeyChecking() ? "yes" : "no");
}
});
}
@Test
public void strictHostKeyCheckShouldCheck() throws Exception {
String uri = "git+ssh://[email protected]/somegitrepo";
SshSessionFactory.setInstance(null);
this.jGitEnvironmentRepository.setUri(uri);
this.jGitEnvironmentRepository.setBasedir(new File("./mybasedir"));
assertThat(this.jGitEnvironmentRepository.isStrictHostKeyChecking())
.isTrue();
this.jGitEnvironmentRepository.setCloneOnStart(true);
try {
// this will throw but we don't care about connecting.
this.jGitEnvironmentRepository.afterPropertiesSet();
}
catch (Exception e) {
final OpenSshConfig.Host hc = OpenSshConfig.get(FS.detect())
.lookup("github.com");
JschConfigSessionFactory factory = (JschConfigSessionFactory) SshSessionFactory
.getInstance();
// There's no public method that can be used to inspect the ssh
// configuration, so we'll reflect
// the configure method to allow us to check that the config
// property is set as expected.
Method configure = factory.getClass().getDeclaredMethod("configure",
OpenSshConfig.Host.class, Session.class);
configure.setAccessible(true);
Session session = mock(Session.class);
ArgumentCaptor<String> keyCaptor = ArgumentCaptor
.forClass(String.class);
ArgumentCaptor<String> valueCaptor = ArgumentCaptor
.forClass(String.class);
configure.invoke(factory, hc, session);
verify(session).setConfig(keyCaptor.capture(), valueCaptor.capture());
configure.setAccessible(false);
assertThat("yes".equals(valueCaptor.getValue())).isTrue();
}
}
@Test
public void strictHostKeyCheckShouldCheck() throws Exception {
String uri = "git+ssh://[email protected]/somegitrepo";
SshSessionFactory.setInstance(null);
this.jGitEnvironmentRepository.setUri(uri);
this.jGitEnvironmentRepository.setBasedir(new File("./mybasedir"));
assertThat(this.jGitEnvironmentRepository.isStrictHostKeyChecking())
.isTrue();
this.jGitEnvironmentRepository.setCloneOnStart(true);
try {
// this will throw but we don't care about connecting.
this.jGitEnvironmentRepository.afterPropertiesSet();
}
catch (Exception e) {
final OpenSshConfig.Host hc = OpenSshConfig.get(FS.detect())
.lookup("github.com");
JschConfigSessionFactory factory = (JschConfigSessionFactory) SshSessionFactory
.getInstance();
// There's no public method that can be used to inspect the ssh
// configuration, so we'll reflect
// the configure method to allow us to check that the config
// property is set as expected.
Method configure = factory.getClass().getDeclaredMethod("configure",
OpenSshConfig.Host.class, Session.class);
configure.setAccessible(true);
Session session = mock(Session.class);
ArgumentCaptor<String> keyCaptor = ArgumentCaptor
.forClass(String.class);
ArgumentCaptor<String> valueCaptor = ArgumentCaptor
.forClass(String.class);
configure.invoke(factory, hc, session);
verify(session).setConfig(keyCaptor.capture(), valueCaptor.capture());
configure.setAccessible(false);
assertThat("yes".equals(valueCaptor.getValue())).isTrue();
}
}
private void assertIdentity(final String identityFile, final String passphrase) {
final SshAgentSessionFactory factory = (SshAgentSessionFactory) JschConfigSessionFactory.getInstance();
assertEquals(identityFile, factory.getIdentityFile());
assertEquals(passphrase, factory.getPassphraseOrNull());
}