fix(console): fix command not found [EE-6982] (#11832)

pull/11859/head
Matt Hook 2024-05-20 14:35:40 +12:00 committed by GitHub
parent 6c98271e43
commit f5d896bce1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 6 deletions

View File

@ -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();

View File

@ -29,6 +29,7 @@
<select class="form-control" ng-model="formValues.command" id="command">
<option value="ash" ng-if="imageOS == 'linux'">/bin/ash</option>
<option value="bash" ng-if="imageOS == 'linux'">/bin/bash</option>
<option value="dash" ng-if="imageOS == 'linux'">/bin/dash</option>
<option value="sh" ng-if="imageOS == 'linux'">/bin/sh</option>
<option value="powershell" ng-if="imageOS == 'windows'">powershell</option>
<option value="cmd.exe" ng-if="imageOS == 'windows'">cmd.exe</option>