1 package org
.argeo
.cms
.ssh
.cli
;
3 import java
.io
.IOException
;
4 import java
.lang
.management
.ManagementFactory
;
6 import java
.security
.GeneralSecurityException
;
7 import java
.security
.KeyPair
;
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
;
24 public class SshShell
implements DescribedCommand
<String
> {
25 private Option portOption
;
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
);
36 public String
apply(List
<String
> args
) {
37 CommandLine cl
= toCommandLine(args
);
38 String portStr
= cl
.getOptionValue(portOption
);
42 if (cl
.getArgList().size() == 0)
43 throw new CommandArgsException("Host must be provided");
44 String host
= cl
.getArgList().get(0);
46 String uriStr
= "ssh://" + host
+ ":" + portStr
+ "/";
47 // System.out.println(uriStr);
48 URI uri
= URI
.create(uriStr
);
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());
66 } catch (Exception e
) {
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";
77 char[] keyPassword
= AbstractSsh
.readPassword();
78 NamedResource namedResource
= new NamedResource() {
81 public String
getName() {
85 KeyPair keyPair
= new DefaultClientIdentityLoader()
86 .loadClientIdentities(null, namedResource
, FilePasswordProvider
.of(new String(keyPassword
)))
88 sshAgent
.addIdentity(keyPair
, "NO COMMENT");
91 // char[] keyPassword = AbstractSsh.readPassword();
92 // SshKeyPair keyPair = SshKeyPair.loadDefault(keyPassword);
93 // Arrays.fill(keyPassword, '*');
94 // ssh.setSshKeyPair(keyPair);
95 // ssh.authenticate();
98 long jvmUptime
= ManagementFactory
.getRuntimeMXBean().getUptime();
99 System
.out
.println("Ssh available in " + jvmUptime
+ " ms.");
101 AbstractSsh
.openShell(ssh
);
102 } catch (IOException
| GeneralSecurityException e
) {
103 // TODO Auto-generated catch block
113 public String
getUsage() {
118 public String
getDescription() {
119 return "Opens a remote shell";