From 9885228c89ca6da1835c1c3e098c92589d76301e Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 5 Sep 2019 20:53:03 +0200 Subject: [PATCH] Introduce SSH server. --- .../src/org/argeo/ssh/SimpleSshServer.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 org.argeo.core/src/org/argeo/ssh/SimpleSshServer.java diff --git a/org.argeo.core/src/org/argeo/ssh/SimpleSshServer.java b/org.argeo.core/src/org/argeo/ssh/SimpleSshServer.java new file mode 100644 index 000000000..801384513 --- /dev/null +++ b/org.argeo.core/src/org/argeo/ssh/SimpleSshServer.java @@ -0,0 +1,102 @@ +package org.argeo.ssh; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.apache.sshd.server.SshServer; +import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; +import org.apache.sshd.server.scp.ScpCommandFactory; +import org.apache.sshd.server.shell.ProcessShellFactory; +import org.argeo.util.OS; + +/** A simple SSH server with some defaults. Supports SCP. */ +public class SimpleSshServer { + private Integer port; + private Path hostKeyPath; + + private SshServer sshd = null; + + public SimpleSshServer(Integer port, Path hostKeyPath) { + this.port = port; + this.hostKeyPath = hostKeyPath; + } + + public void init() { + try { + sshd = SshServer.setUpDefaultServer(); + sshd.setPort(port); + if (hostKeyPath == null) + throw new IllegalStateException("An SSH server key must be set"); + sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(hostKeyPath)); + // sshd.setShellFactory(new ProcessShellFactory(new String[] { "/bin/sh", "-i", + // "-l" })); + String[] shellCommand = OS.LOCAL.getDefaultShellCommand(); + sshd.setShellFactory(new ProcessShellFactory(shellCommand)); + sshd.setCommandFactory(new ScpCommandFactory()); + sshd.start(); + } catch (Exception e) { + throw new RuntimeException("Cannot start SSH server on port " + port, e); + } + } + + public void destroy() { + try { + sshd.stop(); + } catch (IOException e) { + throw new RuntimeException("Cannot stop SSH server on port " + port, e); + } + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public Path getHostKeyPath() { + return hostKeyPath; + } + + public void setHostKeyPath(Path hostKeyPath) { + this.hostKeyPath = hostKeyPath; + } + + public static void main(String[] args) { + int port = 2222; + Path hostKeyPath = Paths.get("hostkey.ser"); + try { + if (args.length > 0) + port = Integer.parseInt(args[0]); + if (args.length > 1) + hostKeyPath = Paths.get(args[1]); + } catch (Exception e1) { + printUsage(); + } + + SimpleSshServer sshServer = new SimpleSshServer(port, hostKeyPath); + sshServer.init(); + Runtime.getRuntime().addShutdownHook(new Thread("Shutdown SSH server") { + + @Override + public void run() { + sshServer.destroy(); + } + }); + try { + synchronized (sshServer) { + sshServer.wait(); + } + } catch (InterruptedException e) { + sshServer.destroy(); + } + + } + + public static void printUsage() { + System.out.println("java " + SimpleSshServer.class.getName() + " [port] [server key path]"); + } + +} -- 2.30.2