in gshell-commands/gshell-ssh/src/main/java/org/apache/geronimo/gshell/commands/ssh/SshAction.java [103:169]
public Object execute(final CommandContext context) throws Exception {
assert context != null;
IO io = context.getIo();
MessageSource messages = context.getCommand().getMessages();
//
// TODO: Parse hostname for <username>@<hostname>
//
io.info(messages.format("info.connecting", hostname, port));
// If the username/password was not configured via cli, then prompt the user for the values
if (username == null || password == null) {
PromptReader prompter = new PromptReader(io);
String text;
log.debug("Prompting user for credentials");
if (username == null) {
text = messages.getMessage("prompt.username");
username = prompter.readLine(text + ": ", new UsernamePasswordValidator(text));
}
if (password == null) {
text = messages.getMessage("prompt.password");
password = prompter.readPassword(text + ": ", new UsernamePasswordValidator(text));
}
}
// Create the client from prototype
SshClient client = container.getBean(SshClient.class);
log.debug("Created client: {}", client);
client.start();
try {
ConnectFuture future = client.connect(hostname, port);
future.await();
ClientSession session = future.getSession();
try {
io.info(messages.getMessage("info.connected"));
session.authPassword(username, password);
int ret = session.waitFor(ClientSession.WAIT_AUTH | ClientSession.CLOSED | ClientSession.AUTHED, 0);
if ((ret & ClientSession.AUTHED) == 0) {
io.err.println("Authentication failed");
return Result.FAILURE;
}
ClientChannel channel = session.createChannel("shell");
channel.setIn(new NoCloseInputStream(io.inputStream));
channel.setOut(new NoCloseOutputStream(io.outputStream));
channel.setErr(new NoCloseOutputStream(io.errorStream));
channel.open();
channel.waitFor(ClientChannel.CLOSED, 0);
} finally {
session.close(false);
}
} finally {
client.stop();
}
io.verbose(messages.getMessage("verbose.disconnected"));
return Result.SUCCESS;
}