2013-11-14 07:17:51 +00:00
|
|
|
package com.ryanmichela.sshd;
|
|
|
|
|
2019-10-03 02:14:56 +00:00
|
|
|
import com.ryanmichela.sshd.ConsoleCommandCompleter;
|
|
|
|
import com.ryanmichela.sshd.ConsoleLogFormatter;
|
|
|
|
import com.ryanmichela.sshd.FlushyOutputStream;
|
|
|
|
import com.ryanmichela.sshd.FlushyStreamHandler;
|
|
|
|
import com.ryanmichela.sshd.SshTerminal;
|
|
|
|
import com.ryanmichela.sshd.SshdPlugin;
|
|
|
|
import com.ryanmichela.sshd.StreamHandlerAppender;
|
2018-02-10 16:13:21 +00:00
|
|
|
import com.ryanmichela.sshd.implementations.SSHDCommandSender;
|
2017-11-14 14:06:20 +00:00
|
|
|
import jline.console.ConsoleReader;
|
2014-07-03 07:18:34 +00:00
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
|
import org.apache.logging.log4j.core.Logger;
|
2013-11-14 07:17:51 +00:00
|
|
|
import org.apache.sshd.common.Factory;
|
2019-10-03 02:14:56 +00:00
|
|
|
import org.apache.sshd.server.shell.ShellFactory;
|
|
|
|
import org.apache.sshd.server.command.Command;
|
|
|
|
import org.apache.sshd.server.channel.ChannelSession;
|
2013-11-14 07:17:51 +00:00
|
|
|
import org.apache.sshd.server.Environment;
|
|
|
|
import org.apache.sshd.server.ExitCallback;
|
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.io.OutputStream;
|
2018-02-10 16:13:21 +00:00
|
|
|
import java.util.logging.Level;
|
2013-11-14 07:17:51 +00:00
|
|
|
import java.util.logging.StreamHandler;
|
|
|
|
|
2019-10-03 02:14:56 +00:00
|
|
|
public class ConsoleShellFactory implements ShellFactory {
|
2018-02-10 16:13:21 +00:00
|
|
|
|
|
|
|
static SSHDCommandSender sshdCommandSender = new SSHDCommandSender();
|
|
|
|
|
2019-10-03 02:14:56 +00:00
|
|
|
public Command createShell(ChannelSession cs) {
|
2013-11-14 07:17:51 +00:00
|
|
|
return new ConsoleShell();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class ConsoleShell implements Command, Runnable {
|
2018-05-06 16:42:39 +00:00
|
|
|
|
2013-11-14 07:17:51 +00:00
|
|
|
private InputStream in;
|
|
|
|
private OutputStream out;
|
|
|
|
private OutputStream err;
|
|
|
|
private ExitCallback callback;
|
|
|
|
private Environment environment;
|
|
|
|
private Thread thread;
|
|
|
|
|
2014-07-03 07:18:34 +00:00
|
|
|
StreamHandlerAppender streamHandlerAppender;
|
2018-02-10 16:13:21 +00:00
|
|
|
public static ConsoleReader consoleReader;
|
2013-11-14 07:17:51 +00:00
|
|
|
|
|
|
|
public InputStream getIn() {
|
|
|
|
return in;
|
|
|
|
}
|
|
|
|
|
|
|
|
public OutputStream getOut() {
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
|
|
|
|
public OutputStream getErr() {
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Environment getEnvironment() {
|
|
|
|
return environment;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setInputStream(InputStream in) {
|
|
|
|
this.in = in;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setOutputStream(OutputStream out) {
|
|
|
|
this.out = out;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setErrorStream(OutputStream err) {
|
|
|
|
this.err = err;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setExitCallback(ExitCallback callback) {
|
|
|
|
this.callback = callback;
|
|
|
|
}
|
|
|
|
|
2019-10-03 02:14:56 +00:00
|
|
|
@Override
|
|
|
|
public void start(ChannelSession cs, Environment env) throws IOException
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
consoleReader = new ConsoleReader(in, new FlushyOutputStream(out), new SshTerminal());
|
|
|
|
consoleReader.setExpandEvents(true);
|
|
|
|
consoleReader.addCompleter(new ConsoleCommandCompleter());
|
|
|
|
|
|
|
|
StreamHandler streamHandler = new FlushyStreamHandler(out, new ConsoleLogFormatter(), consoleReader);
|
|
|
|
streamHandlerAppender = new StreamHandlerAppender(streamHandler);
|
|
|
|
|
|
|
|
((Logger)LogManager.getRootLogger()).addAppender(streamHandlerAppender);
|
|
|
|
|
|
|
|
environment = env;
|
|
|
|
thread = new Thread(this, "SSHD ConsoleShell " + env.getEnv().get(Environment.ENV_USER));
|
|
|
|
thread.start();
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
throw new IOException("Error starting shell", e);
|
|
|
|
}
|
2013-11-14 07:17:51 +00:00
|
|
|
}
|
|
|
|
|
2019-10-03 02:14:56 +00:00
|
|
|
@Override
|
|
|
|
public void destroy(ChannelSession cs) { ((Logger)LogManager.getRootLogger()).removeAppender(streamHandlerAppender); }
|
2013-11-14 07:17:51 +00:00
|
|
|
|
2019-10-03 02:14:56 +00:00
|
|
|
public void run()
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2018-02-10 16:13:21 +00:00
|
|
|
if (!SshdPlugin.instance.getConfig().getString("mode").equals("RPC"))
|
|
|
|
printPreamble(consoleReader);
|
2019-10-03 02:14:56 +00:00
|
|
|
while (true)
|
|
|
|
{
|
2017-11-14 14:06:20 +00:00
|
|
|
String command = consoleReader.readLine("\r>", null);
|
2019-10-03 02:14:56 +00:00
|
|
|
if (command == null)
|
|
|
|
continue;
|
|
|
|
if (command.equals("exit") || command.equals("quit"))
|
|
|
|
break;
|
|
|
|
Bukkit.getScheduler().runTask(
|
|
|
|
SshdPlugin.instance, () ->
|
|
|
|
{
|
|
|
|
if (SshdPlugin.instance.getConfig().getString("mode").equals("RPC") && command.startsWith("rpc"))
|
|
|
|
{
|
|
|
|
// NO ECHO NO PREAMBLE AND SHIT
|
|
|
|
String cmd = command.substring("rpc".length() + 1, command.length());
|
|
|
|
Bukkit.dispatchCommand(sshdCommandSender, cmd);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SshdPlugin.instance.getLogger().info("<" + environment.getEnv().get(Environment.ENV_USER) + "> "
|
|
|
|
+ command);
|
|
|
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
|
|
|
|
}
|
|
|
|
});
|
2013-11-14 07:17:51 +00:00
|
|
|
}
|
2019-10-03 02:14:56 +00:00
|
|
|
}
|
|
|
|
catch (IOException e)
|
|
|
|
{
|
2018-02-10 16:13:21 +00:00
|
|
|
SshdPlugin.instance.getLogger().log(Level.SEVERE, "Error processing command from SSH", e);
|
2019-10-03 02:14:56 +00:00
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
2013-11-14 07:17:51 +00:00
|
|
|
callback.onExit(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-03 02:14:56 +00:00
|
|
|
private void printPreamble(ConsoleReader consoleReader) throws IOException
|
|
|
|
{
|
2017-11-15 17:46:32 +00:00
|
|
|
consoleReader.println(" _____ _____ _ _ _____" + "\r");
|
|
|
|
consoleReader.println(" / ____/ ____| | | | __ \\" + "\r");
|
|
|
|
consoleReader.println("| (___| (___ | |__| | | | |" + "\r");
|
|
|
|
consoleReader.println(" \\___ \\\\___ \\| __ | | | |" + "\r");
|
|
|
|
consoleReader.println(" ____) |___) | | | | |__| |" + "\r");
|
|
|
|
consoleReader.println("|_____/_____/|_| |_|_____/" + "\r");
|
|
|
|
consoleReader.println("Connected to: " + Bukkit.getServer().getName() + "\r");
|
|
|
|
consoleReader.println("- " + Bukkit.getServer().getMotd() + "\r");
|
|
|
|
consoleReader.println("\r");
|
|
|
|
consoleReader.println("Type 'exit' to exit the shell." + "\r");
|
|
|
|
consoleReader.println("===============================================" + "\r");
|
2013-11-14 07:17:51 +00:00
|
|
|
}
|
2019-10-03 02:14:56 +00:00
|
|
|
}
|
2013-11-14 07:17:51 +00:00
|
|
|
}
|