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