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
.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
;
25 public class SshShell
implements DescribedCommand
<String
> {
26 private Option portOption
;
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
);
37 public String
apply(List
<String
> args
) {
38 CommandLine cl
= toCommandLine(args
);
39 String portStr
= cl
.getOptionValue(portOption
);
43 if (cl
.getArgList().size() == 0)
44 throw new CommandArgsException("Host must be provided");
45 String host
= cl
.getArgList().get(0);
47 String uriStr
= "ssh://" + host
+ ":" + portStr
+ "/";
48 // System.out.println(uriStr);
49 URI uri
= URI
.create(uriStr
);
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());
67 } catch (Exception e
) {
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";
78 char[] keyPassword
= AbstractSsh
.readPassword();
79 NamedResource namedResource
= new NamedResource() {
82 public String
getName() {
86 KeyPair keyPair
= ClientIdentityLoader
.DEFAULT
87 .loadClientIdentities(null, namedResource
, FilePasswordProvider
.of(new String(keyPassword
)))
89 sshAgent
.addIdentity(keyPair
, "NO COMMENT");
92 // char[] keyPassword = AbstractSsh.readPassword();
93 // SshKeyPair keyPair = SshKeyPair.loadDefault(keyPassword);
94 // Arrays.fill(keyPassword, '*');
95 // ssh.setSshKeyPair(keyPair);
96 // ssh.authenticate();
99 long jvmUptime
= ManagementFactory
.getRuntimeMXBean().getUptime();
100 System
.out
.println("Ssh available in " + jvmUptime
+ " ms.");
102 AbstractSsh
.openShell(ssh
);
103 } catch (IOException
| GeneralSecurityException e
) {
104 // TODO Auto-generated catch block
114 public String
getUsage() {
119 public String
getDescription() {
120 return "Opens a remote shell";