]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.lib.sshd/src/org/argeo/cms/ssh/cli/SshShell.java
Remove explicit dependency to SSHD bundle
[lgpl/argeo-commons.git] / org.argeo.cms.lib.sshd / src / org / argeo / cms / ssh / cli / SshShell.java
1 package org.argeo.cms.ssh.cli;
2
3 import java.io.IOException;
4 import java.lang.management.ManagementFactory;
5 import java.net.URI;
6 import java.security.GeneralSecurityException;
7 import java.security.KeyPair;
8 import java.util.List;
9
10 import org.apache.commons.cli.CommandLine;
11 import org.apache.commons.cli.Option;
12 import org.apache.commons.cli.Options;
13 import org.apache.sshd.agent.SshAgent;
14 import org.apache.sshd.agent.SshAgentFactory;
15 import org.apache.sshd.agent.local.LocalAgentFactory;
16 import org.apache.sshd.agent.unix.UnixAgentFactory;
17 import org.apache.sshd.client.config.keys.ClientIdentityLoader;
18 import org.apache.sshd.common.NamedResource;
19 import org.apache.sshd.common.config.keys.FilePasswordProvider;
20 import org.argeo.api.cli.DescribedCommand;
21 import org.argeo.cms.ssh.AbstractSsh;
22 import org.argeo.cms.ssh.Ssh;
23
24 public class SshShell implements DescribedCommand<String> {
25 private Option portOption;
26
27 @Override
28 public Options getOptions() {
29 Options options = new Options();
30 portOption = Option.builder().option("p").longOpt("port").hasArg().desc("port to connect to").build();
31 options.addOption(portOption);
32 return options;
33 }
34
35 @Override
36 public String apply(List<String> args) {
37 CommandLine cl = toCommandLine(args);
38 String portStr = cl.getOptionValue(portOption);
39 if (portStr == null)
40 portStr = "22";
41
42 String host = cl.getArgList().get(0);
43
44 String uriStr = "ssh://" + host + ":" + portStr + "/";
45 // System.out.println(uriStr);
46 URI uri = URI.create(uriStr);
47
48 Ssh ssh = null;
49 try {
50 ssh = new Ssh(uri);
51 boolean osAgent;
52 SshAgent sshAgent;
53 try {
54 String sshAuthSockentEnv = System.getenv(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
55 if (sshAuthSockentEnv != null) {
56 ssh.getSshClient().getProperties().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME, sshAuthSockentEnv);
57 SshAgentFactory agentFactory = new UnixAgentFactory();
58 ssh.getSshClient().setAgentFactory(agentFactory);
59 sshAgent = agentFactory.createClient(null, ssh.getSshClient());
60 osAgent = true;
61 } else {
62 osAgent = false;
63 }
64 } catch (Exception e) {
65 e.printStackTrace();
66 osAgent = false;
67 }
68
69 if (!osAgent) {
70 SshAgentFactory agentFactory = new LocalAgentFactory();
71 ssh.getSshClient().setAgentFactory(agentFactory);
72 sshAgent = agentFactory.createClient(null, ssh.getSshClient());
73 String keyPath = System.getProperty("user.home") + "/.ssh/id_rsa";
74
75 char[] keyPassword = AbstractSsh.readPassword();
76 NamedResource namedResource = new NamedResource() {
77
78 @Override
79 public String getName() {
80 return keyPath;
81 }
82 };
83 KeyPair keyPair = ClientIdentityLoader.DEFAULT
84 .loadClientIdentities(null, namedResource, FilePasswordProvider.of(new String(keyPassword)))
85 .iterator().next();
86 sshAgent.addIdentity(keyPair, "NO COMMENT");
87 }
88
89 // char[] keyPassword = AbstractSsh.readPassword();
90 // SshKeyPair keyPair = SshKeyPair.loadDefault(keyPassword);
91 // Arrays.fill(keyPassword, '*');
92 // ssh.setSshKeyPair(keyPair);
93 // ssh.authenticate();
94 ssh.verifyAuth();
95
96 long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
97 System.out.println("Ssh available in " + jvmUptime + " ms.");
98
99 AbstractSsh.openShell(ssh);
100 } catch (IOException | GeneralSecurityException e) {
101 // TODO Auto-generated catch block
102 e.printStackTrace();
103 } finally {
104 if (ssh != null)
105 ssh.closeSession();
106 }
107 return null;
108 }
109
110 @Override
111 public String getDescription() {
112 return "Launch a static CMS.";
113 }
114
115 }