package org.crsh.ssh.term.inline; import org.apache.sshd.server.Environment; import org.crsh.plugin.PluginContext; import org.crsh.shell.Shell; import org.crsh.shell.ShellFactory; import org.crsh.shell.ShellProcess; import org.crsh.shell.ShellResponse; import org.crsh.ssh.term.AbstractCommand; import org.crsh.ssh.term.SSHContext; import org.crsh.ssh.term.SSHLifeCycle; import java.io.IOException; import java.io.PrintStream; import java.security.Principal; import java.util.logging.Level; import java.util.logging.Logger; /** SSH inline command */ public class SSHInlineCommand extends AbstractCommand implements Runnable { /** . */ protected static final Logger log = Logger.getLogger(SSHInlineCommand.class.getName()); /** . */ protected static final int OK = 0; /** . */ protected static final int ERROR = 2; /** . */ private Thread thread; /** . */ private String command; /** . */ private PluginContext pluginContext; /** . */ private Environment env; public SSHInlineCommand(String command, PluginContext pluginContext) { this.command = command; this.pluginContext = pluginContext; } public void start(Environment environment) throws IOException { this.env = environment; thread = new Thread(this, "CRaSH"); thread.start(); } public void destroy() { thread.interrupt(); } public void run() { // get principal PrintStream err = new PrintStream(this.err); PrintStream out = new PrintStream(this.out); final String userName = session.getAttribute(SSHLifeCycle.USERNAME); Principal user = new Principal() { public String getName() { return userName; } }; Shell shell = pluginContext.getPlugin(ShellFactory.class).create(user); ShellProcess shellProcess = shell.createProcess(command); // SSHInlineShellProcessContext context = new SSHInlineShellProcessContext(new SSHContext(env), shellProcess, out, err); int exitStatus = OK; String exitMsg = null; // try { shellProcess.execute(context); } catch (Exception e) { log.log(Level.SEVERE, "Error during command execution", e); exitMsg = e.getMessage(); exitStatus = ERROR; } finally { // get command output ShellResponse response = context.getResponse(); if (response instanceof ShellResponse.Ok) { // Ok } else { String errorMsg; // Set the exit status to Error exitStatus = ERROR; if (response != null) { errorMsg = "Error during command execution : " + response.getMessage(); } else { errorMsg = "Error during command execution"; } err.println(errorMsg); if (response instanceof ShellResponse.Error) { ShellResponse.Error error = (ShellResponse.Error)response; log.log(Level.SEVERE, errorMsg, error.getThrowable()); } else { log.log(Level.SEVERE, errorMsg); } } // Say we are done if (callback != null) { callback.onExit(exitStatus, exitMsg); } } } }