]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.lib.sshd/src/org/argeo/cms/ssh/cli/SshShell.java
Use latest Argeo Build
[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.common.NamedResource;
18 import org.apache.sshd.common.config.keys.FilePasswordProvider;
19 import org.argeo.api.cli.CommandArgsException;
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 if (cl.getArgList().size() == 0)
43 throw new CommandArgsException("Host must be provided");
44 String host = cl.getArgList().get(0);
45
46 String uriStr = "ssh://" + host + ":" + portStr + "/";
47 // System.out.println(uriStr);
48 URI uri = URI.create(uriStr);
49
50 Ssh ssh = null;
51 try {
52 ssh = new Ssh(uri);
53 boolean osAgent;
54 SshAgent sshAgent;
55 try {
56 String sshAuthSockentEnv = System.getenv(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
57 if (sshAuthSockentEnv != null) {
58 ssh.getSshClient().getProperties().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME, sshAuthSockentEnv);
59 SshAgentFactory agentFactory = new UnixAgentFactory();
60 ssh.getSshClient().setAgentFactory(agentFactory);
61 sshAgent = agentFactory.createClient(null, ssh.getSshClient());
62 osAgent = true;
63 } else {
64 osAgent = false;
65 }
66 } catch (Exception e) {
67 e.printStackTrace();
68 osAgent = false;
69 }
70
71 if (!osAgent) {
72 SshAgentFactory agentFactory = new LocalAgentFactory();
73 ssh.getSshClient().setAgentFactory(agentFactory);
74 sshAgent = agentFactory.createClient(null, ssh.getSshClient());
75 String keyPath = System.getProperty("user.home") + "/.ssh/id_rsa";
76
77 char[] keyPassword = AbstractSsh.readPassword();
78 NamedResource namedResource = new NamedResource() {
79
80 @Override
81 public String getName() {
82 return keyPath;
83 }
84 };
85 KeyPair keyPair = new DefaultClientIdentityLoader()
86 .loadClientIdentities(null, namedResource, FilePasswordProvider.of(new String(keyPassword)))
87 .iterator().next();
88 sshAgent.addIdentity(keyPair, "NO COMMENT");
89 }
90
91 // char[] keyPassword = AbstractSsh.readPassword();
92 // SshKeyPair keyPair = SshKeyPair.loadDefault(keyPassword);
93 // Arrays.fill(keyPassword, '*');
94 // ssh.setSshKeyPair(keyPair);
95 // ssh.authenticate();
96 ssh.verifyAuth();
97
98 long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
99 System.out.println("Ssh available in " + jvmUptime + " ms.");
100
101 AbstractSsh.openShell(ssh);
102 } catch (IOException | GeneralSecurityException e) {
103 // TODO Auto-generated catch block
104 e.printStackTrace();
105 } finally {
106 if (ssh != null)
107 ssh.closeSession();
108 }
109 return null;
110 }
111
112 @Override
113 public String getUsage() {
114 return "<hostname>";
115 }
116
117 @Override
118 public String getDescription() {
119 return "Opens a remote shell";
120 }
121
122 }