X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.core%2Fsrc%2Forg%2Fargeo%2Fssh%2FAbstractSsh.java;h=261ac246028bab5707dd9df4c99cfbaec610f1e4;hb=c718f8be43b6ee3b1ba111c2a22c9037e35b872f;hp=f42ae205cfe6cb24a5cbce137b90d3d0de0cc977;hpb=ca59ec5bdf16364159d8d826306c90762192e12c;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.core/src/org/argeo/ssh/AbstractSsh.java b/org.argeo.core/src/org/argeo/ssh/AbstractSsh.java index f42ae205c..261ac2460 100644 --- a/org.argeo.core/src/org/argeo/ssh/AbstractSsh.java +++ b/org.argeo.core/src/org/argeo/ssh/AbstractSsh.java @@ -3,20 +3,24 @@ package org.argeo.ssh; import java.io.Console; import java.io.IOException; import java.net.URI; -import java.security.GeneralSecurityException; -import java.security.KeyPair; +import java.net.URISyntaxException; import java.util.Arrays; +import java.util.HashSet; import java.util.Scanner; +import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.sshd.client.SshClient; -import org.apache.sshd.client.config.keys.ClientIdentityLoader; +import org.apache.sshd.client.channel.ClientChannel; +import org.apache.sshd.client.channel.ClientChannelEvent; import org.apache.sshd.client.future.ConnectFuture; import org.apache.sshd.client.session.ClientSession; -import org.apache.sshd.client.subsystem.sftp.SftpFileSystemProvider; -import org.apache.sshd.common.config.keys.FilePasswordProvider; +import org.apache.sshd.client.subsystem.sftp.fs.SftpFileSystemProvider; +import org.apache.sshd.common.util.io.NoCloseInputStream; +import org.apache.sshd.common.util.io.NoCloseOutputStream; +@SuppressWarnings("restriction") abstract class AbstractSsh { private final static Log log = LogFactory.getLog(AbstractSsh.class); @@ -26,6 +30,8 @@ abstract class AbstractSsh { private boolean passwordSet = false; private ClientSession session; + private SshKeyPair sshKeyPair; + synchronized SshClient getSshClient() { if (sshClient == null) { long begin = System.currentTimeMillis(); @@ -48,21 +54,27 @@ abstract class AbstractSsh { void authenticate() { try { - if (!passwordSet) { - String password; - Console console = System.console(); - if (console == null) {// IDE - System.out.print("Password: "); - Scanner s = new Scanner(System.in); - password = s.next(); - } else { - console.printf("Password: "); - char[] pwd = console.readPassword(); - password = new String(pwd); - Arrays.fill(pwd, ' '); + if (sshKeyPair != null) { + session.addPublicKeyIdentity(sshKeyPair.asKeyPair()); + } else { + + if (!passwordSet) { + String password; + Console console = System.console(); + if (console == null) {// IDE + System.out.print("Password: "); + try (Scanner s = new Scanner(System.in)) { + password = s.next(); + } + } else { + console.printf("Password: "); + char[] pwd = console.readPassword(); + password = new String(pwd); + Arrays.fill(pwd, ' '); + } + session.addPasswordIdentity(password); + passwordSet = true; } - session.addPasswordIdentity(password); - passwordSet = true; } session.auth().verify(1000l); } catch (IOException e) { @@ -79,13 +91,13 @@ abstract class AbstractSsh { } void loadKey(String password, String keyPath) { - try { - KeyPair keyPair = ClientIdentityLoader.DEFAULT.loadClientIdentity(keyPath, - FilePasswordProvider.of(password)); - session.addPublicKeyIdentity(keyPair); - } catch (IOException | GeneralSecurityException e) { - throw new IllegalStateException(e); - } +// try { +// KeyPair keyPair = ClientIdentityLoader.DEFAULT.loadClientIdentity(keyPath, +// FilePasswordProvider.of(password)); +// session.addPublicKeyIdentity(keyPair); +// } catch (IOException | GeneralSecurityException e) { +// throw new IllegalStateException(e); +// } } void openSession(URI uri) { @@ -141,4 +153,37 @@ abstract class AbstractSsh { return session; } + public void setSshKeyPair(SshKeyPair sshKeyPair) { + this.sshKeyPair = sshKeyPair; + } + + public static void openShell(ClientSession session) { + try (ClientChannel channel = session.createChannel(ClientChannel.CHANNEL_SHELL)) { + channel.setIn(new NoCloseInputStream(System.in)); + channel.setOut(new NoCloseOutputStream(System.out)); + channel.setErr(new NoCloseOutputStream(System.err)); + channel.open(); + + Set events = new HashSet<>(); + events.add(ClientChannelEvent.CLOSED); + channel.waitFor(events, 0); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + session.close(false); + } + } + + static URI toUri(String username, String host, int port) { + try { + if (username == null) + username = "root"; + return new URI("ssh://" + username + "@" + host + ":" + port); + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Cannot generate SSH URI to " + host + ":" + port + " for " + username, + e); + } + } + }