1 package org
.argeo
.slc
.tool
;
3 import java
.io
.Console
;
4 import java
.io
.IOException
;
5 import java
.lang
.management
.ManagementFactory
;
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
;
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
;
29 public class SshCli
extends CommandsCli
{
30 public SshCli(String commandName
) {
32 addCommand("shell", new SshShell());
36 public String
getDescription() {
37 return "Argeo CMS utilities.";
40 static class SshShell
implements DescribedCommand
<String
> {
41 private Option portOption
;
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
);
52 public String
apply(List
<String
> args
) {
53 CommandLine cl
= toCommandLine(args
);
54 String portStr
= cl
.getOptionValue(portOption
);
58 String host
= cl
.getArgList().get(0);
60 String uriStr
= "ssh://" + host
+ ":" + portStr
+ "/";
61 // System.out.println(uriStr);
62 URI uri
= URI
.create(uriStr
);
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());
80 } catch (Exception e
) {
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";
91 char[] keyPassword
= AbstractSsh
.readPassword();
92 NamedResource namedResource
= new NamedResource() {
95 public String
getName() {
99 KeyPair keyPair
= ClientIdentityLoader
.DEFAULT
100 .loadClientIdentities(null, namedResource
, FilePasswordProvider
.of(new String(keyPassword
)))
102 sshAgent
.addIdentity(keyPair
, "NO COMMENT");
105 // char[] keyPassword = AbstractSsh.readPassword();
106 // SshKeyPair keyPair = SshKeyPair.loadDefault(keyPassword);
107 // Arrays.fill(keyPassword, '*');
108 // ssh.setSshKeyPair(keyPair);
109 // ssh.authenticate();
112 long jvmUptime
= ManagementFactory
.getRuntimeMXBean().getUptime();
113 System
.out
.println("Ssh available in " + jvmUptime
+ " ms.");
115 AbstractSsh
.openShell(ssh
);
116 } catch (IOException
| GeneralSecurityException e
) {
117 // TODO Auto-generated catch block
127 public String
getDescription() {
128 return "Launch a static CMS.";