diff --git a/client/src/main/java/com/taobao/arthas/client/TelnetConsole.java b/client/src/main/java/com/taobao/arthas/client/TelnetConsole.java index be32d11fb..8bb4e087d 100644 --- a/client/src/main/java/com/taobao/arthas/client/TelnetConsole.java +++ b/client/src/main/java/com/taobao/arthas/client/TelnetConsole.java @@ -240,101 +240,107 @@ public class TelnetConsole { consoleReader.setHandleUserInterrupt(true); Terminal terminal = consoleReader.getTerminal(); - if (terminal instanceof TerminalSupport) { - ((TerminalSupport) terminal).disableInterruptCharacter(); - } - // support catch ctrl+c event terminal.disableInterruptCharacter(); if (terminal instanceof UnixTerminal) { ((UnixTerminal) terminal).disableLitteralNextCharacter(); } - int width = TerminalSupport.DEFAULT_WIDTH; - int height = TerminalSupport.DEFAULT_HEIGHT; + try { + int width = TerminalSupport.DEFAULT_WIDTH; + int height = TerminalSupport.DEFAULT_HEIGHT; - if (!cmds.isEmpty()) { - // batch mode - if (telnetConsole.getWidth() != null) { - width = telnetConsole.getWidth(); - } - if (telnetConsole.getheight() != null) { - height = telnetConsole.getheight(); - } - } else { - // normal telnet client, get current terminal size - if (telnetConsole.getWidth() != null) { - width = telnetConsole.getWidth(); - } else { - width = terminal.getWidth(); - // hack for windows dos - if (OSUtils.isWindows()) { - width--; + if (!cmds.isEmpty()) { + // batch mode + if (telnetConsole.getWidth() != null) { + width = telnetConsole.getWidth(); + } + if (telnetConsole.getheight() != null) { + height = telnetConsole.getheight(); } - } - if (telnetConsole.getheight() != null) { - height = telnetConsole.getheight(); } else { - height = terminal.getHeight(); + // normal telnet client, get current terminal size + if (telnetConsole.getWidth() != null) { + width = telnetConsole.getWidth(); + } else { + width = terminal.getWidth(); + // hack for windows dos + if (OSUtils.isWindows()) { + width--; + } + } + if (telnetConsole.getheight() != null) { + height = telnetConsole.getheight(); + } else { + height = terminal.getHeight(); + } } - } - - final TelnetClient telnet = new TelnetClient(); - telnet.setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT); - // send init terminal size - TelnetOptionHandler sizeOpt = new WindowSizeOptionHandler(width, height, true, true, false, false); - try { - telnet.addOptionHandler(sizeOpt); - } catch (InvalidTelnetOptionException e) { - // ignore - } + final TelnetClient telnet = new TelnetClient(); + telnet.setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT); - // ctrl + c event callback - consoleReader.getKeys().bind(new Character((char) CTRL_C).toString(), new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - try { - consoleReader.getCursorBuffer().clear(); // clear current line - telnet.getOutputStream().write(CTRL_C); - telnet.getOutputStream().flush(); - } catch (Exception e1) { - e1.printStackTrace(); - } + // send init terminal size + TelnetOptionHandler sizeOpt = new WindowSizeOptionHandler(width, height, true, true, false, false); + try { + telnet.addOptionHandler(sizeOpt); + } catch (InvalidTelnetOptionException e) { + // ignore } - }); + // ctrl + c event callback + consoleReader.getKeys().bind(new Character((char) CTRL_C).toString(), new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + try { + consoleReader.getCursorBuffer().clear(); // clear current line + telnet.getOutputStream().write(CTRL_C); + telnet.getOutputStream().flush(); + } catch (Exception e1) { + e1.printStackTrace(); + } + } - // ctrl + d event call back - consoleReader.getKeys().bind(new Character(KeyMap.CTRL_D).toString(), eotEventCallback); + }); - try { - telnet.connect(telnetConsole.getTargetIp(), telnetConsole.getPort()); - } catch (IOException e) { - System.out.println("Connect to telnet server error: " + telnetConsole.getTargetIp() + " " - + telnetConsole.getPort()); - throw e; - } + // ctrl + d event call back + consoleReader.getKeys().bind(new Character(KeyMap.CTRL_D).toString(), eotEventCallback); - if (cmds.isEmpty()) { - IOUtil.readWrite(telnet.getInputStream(), telnet.getOutputStream(), System.in, - consoleReader.getOutput()); - } else { try { - return batchModeRun(telnet, cmds, telnetConsole.getExecutionTimeout()); - } catch (Throwable e) { - System.out.println("Execute commands error: " + e.getMessage()); - e.printStackTrace(); - return STATUS_EXEC_ERROR; - } finally { + telnet.connect(telnetConsole.getTargetIp(), telnetConsole.getPort()); + } catch (IOException e) { + System.out.println("Connect to telnet server error: " + telnetConsole.getTargetIp() + " " + + telnetConsole.getPort()); + throw e; + } + + if (cmds.isEmpty()) { + IOUtil.readWrite(telnet.getInputStream(), telnet.getOutputStream(), System.in, + consoleReader.getOutput()); + } else { try { - telnet.disconnect(); - } catch (IOException e) { - //ignore ex + return batchModeRun(telnet, cmds, telnetConsole.getExecutionTimeout()); + } catch (Throwable e) { + System.out.println("Execute commands error: " + e.getMessage()); + e.printStackTrace(); + return STATUS_EXEC_ERROR; + } finally { + try { + telnet.disconnect(); + } catch (IOException e) { + //ignore ex + } } } + + return STATUS_OK; + } finally { + //reset terminal setting, fix https://github.com/alibaba/arthas/issues/1412 + terminal.enableInterruptCharacter(); + if (terminal instanceof UnixTerminal) { + ((UnixTerminal) terminal).enableLitteralNextCharacter(); + } } - return STATUS_OK; + } private static int batchModeRun(TelnetClient telnet, List commands, final int executionTimeout)