]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.lib.sshd/src/org/argeo/cms/ssh/cli/SshShell.java
f8870b97b6131da21f5cd8cc3c96a4cc4ab47f61
[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.CommandArgsException;
21 import org.argeo.api.cli.DescribedCommand;
22 import org.argeo.cms.ssh.AbstractSsh;
23 import org.argeo.cms.ssh.Ssh;
24
25 public class SshShell implements DescribedCommand<String> {
26 private Option portOption;
27
28 @Override
29 public Options getOptions() {
30 Options options = new Options();
31 portOption = Option.builder().option("p").longOpt("port").hasArg().desc("port to connect to").build();
32 options.addOption(portOption);
33 return options;
34 }
35
36 @Override
37 public String apply(List<String> args) {
38 CommandLine cl = toCommandLine(args);
39 String portStr = cl.getOptionValue(portOption);
40 if (portStr == null)
41 portStr = "22";
42
43 if (cl.getArgList().size() == 0)
44 throw new CommandArgsException("Host must be provided");
45 String host = cl.getArgList().get(0);
46
47 String uriStr = "ssh://" + host + ":" + portStr + "/";
48 // System.out.println(uriStr);
49 URI uri = URI.create(uriStr);
50
51 Ssh ssh = null;
52 try {
53 ssh = new Ssh(uri);
54 boolean osAgent;
55 SshAgent sshAgent;
56 try {
57 String sshAuthSockentEnv = System.getenv(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
58 if (sshAuthSockentEnv != null) {
59 ssh.getSshClient().getProperties().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME, sshAuthSockentEnv);
60 SshAgentFactory agentFactory = new UnixAgentFactory();
61 ssh.getSshClient().setAgentFactory(agentFactory);
62 sshAgent = agentFactory.createClient(null, ssh.getSshClient());
63 osAgent = true;
64 } else {
65 osAgent = false;
66 }
67 } catch (Exception e) {
68 e.printStackTrace();
69 osAgent = false;
70 }
71
72 if (!osAgent) {
73 SshAgentFactory agentFactory = new LocalAgentFactory();
74 ssh.getSshClient().setAgentFactory(agentFactory);
75 sshAgent = agentFactory.createClient(null, ssh.getSshClient());
76 String keyPath = System.getProperty("user.home") + "/.ssh/id_rsa";
77
78 char[] keyPassword = AbstractSsh.readPassword();
79 NamedResource namedResource = new NamedResource() {
80
81 @Override
82 public String getName() {
83 return keyPath;
84 }
85 };
86 KeyPair keyPair = ClientIdentityLoader.DEFAULT
87 .loadClientIdentities(null, namedResource, FilePasswordProvider.of(new String(keyPassword)))
88 .iterator().next();
89 sshAgent.addIdentity(keyPair, "NO COMMENT");
90 }
91
92 // char[] keyPassword = AbstractSsh.readPassword();
93 // SshKeyPair keyPair = SshKeyPair.loadDefault(keyPassword);
94 // Arrays.fill(keyPassword, '*');
95 // ssh.setSshKeyPair(keyPair);
96 // ssh.authenticate();
97 ssh.verifyAuth();
98
99 long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
100 System.out.println("Ssh available in " + jvmUptime + " ms.");
101
102 AbstractSsh.openShell(ssh);
103 } catch (IOException | GeneralSecurityException e) {
104 // TODO Auto-generated catch block
105 e.printStackTrace();
106 } finally {
107 if (ssh != null)
108 ssh.closeSession();
109 }
110 return null;
111 }
112
113 @Override
114 public String getUsage() {
115 return "<hostname>";
116 }
117
118 @Override
119 public String getDescription() {
120 return "Opens a remote shell";
121 }
122
123 }