diff --git a/app/docker/views/containers/console/containerConsoleController.js b/app/docker/views/containers/console/containerConsoleController.js index 57551796e..43713e4ff 100644 --- a/app/docker/views/containers/console/containerConsoleController.js +++ b/app/docker/views/containers/console/containerConsoleController.js @@ -121,7 +121,8 @@ angular.module('portainer.docker').controller('ContainerConsoleController', [ .map((k) => k + '=' + params[k]) .join('&'); - initTerm(url, ExecService.resizeTTY.bind(this, params.id)); + const isLinuxCommand = execConfig.Cmd ? isLinuxTerminalCommand(execConfig.Cmd[0]) : false; + initTerm(url, ExecService.resizeTTY.bind(this, params.id), isLinuxCommand); }) .catch(function error(err) { Notifications.error('Failure', err, 'Unable to exec into container'); @@ -165,7 +166,12 @@ angular.module('portainer.docker').controller('ContainerConsoleController', [ restcall(termWidth + add, termHeight + add, 1); } - function initTerm(url, resizeRestCall) { + function isLinuxTerminalCommand(command) { + const validShellCommands = ['ash', 'bash', 'dash', 'sh']; + return validShellCommands.includes(command); + } + + function initTerm(url, resizeRestCall, isLinuxTerm = false) { let resizefun = resize.bind(this, resizeRestCall); if ($transition$.params().nodeName) { @@ -183,13 +189,20 @@ angular.module('portainer.docker').controller('ContainerConsoleController', [ socket.onopen = function () { $scope.state = states.connected; term = new Terminal(); - socket.send('export LANG=C.UTF-8\n'); - socket.send('export LC_ALL=C.UTF-8\n'); - socket.send('clear\n'); + + if (isLinuxTerm) { + // linux terminals support xterm + socket.send('export LANG=C.UTF-8\n'); + socket.send('export LC_ALL=C.UTF-8\n'); + socket.send('export TERM="xterm-256color"\n'); + socket.send('alias ls="ls --color=auto"\n'); + socket.send('echo -e "\\033[2J\\033[H"\n'); + } term.onData(function (data) { socket.send(data); }); + var terminal_container = document.getElementById('terminal-container'); term.open(terminal_container); term.focus(); @@ -207,11 +220,13 @@ angular.module('portainer.docker').controller('ContainerConsoleController', [ socket.onmessage = function (e) { term.write(e.data); }; + socket.onerror = function (err) { $scope.disconnect(); - $scope.$apply(); Notifications.error('Failure', err, 'Connection error'); + $scope.$apply(); }; + socket.onclose = function () { $scope.disconnect(); $scope.$apply(); diff --git a/app/docker/views/containers/console/exec.html b/app/docker/views/containers/console/exec.html index 7be43080f..c474cc558 100644 --- a/app/docker/views/containers/console/exec.html +++ b/app/docker/views/containers/console/exec.html @@ -29,6 +29,7 @@