fix(terminal): preserve PATH for SSH proxy commands (#11638)

This commit is contained in:
Andras Bacsai 2026-09-05 15:18:37 +02:00 committed by GitHub
parent 2a25e0490e
commit bf874029d8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 40 additions and 4 deletions

View file

@ -4,7 +4,7 @@
'coolify' => [
'version' => env('COOLIFY_VERSION') ?: '4.3.18',
'helper_version' => '1.0.16',
'realtime_version' => '1.0.18',
'realtime_version' => '1.0.19',
'railpack_version' => '0.23.0',
'self_hosted' => env('SELF_HOSTED', true),
'autoupdate' => env('AUTOUPDATE'),

View file

@ -62,7 +62,7 @@ services:
retries: 10
timeout: 2s
soketi:
image: '${REGISTRY_URL:-docker.io}/coollabsio/coolify-realtime:1.0.18'
image: '${REGISTRY_URL:-docker.io}/coollabsio/coolify-realtime:1.0.19'
ports:
- "${SOKETI_PORT:-6001}:6001"
- "6002:6002"

View file

@ -97,7 +97,7 @@ services:
retries: 10
timeout: 2s
soketi:
image: 'ghcr.io/coollabsio/coolify-realtime:1.0.18'
image: 'ghcr.io/coollabsio/coolify-realtime:1.0.19'
pull_policy: always
container_name: coolify-realtime
restart: always

View file

@ -8,6 +8,7 @@ import {
extractSshArgs,
extractTargetHost,
extractTimeout,
getTerminalProcessEnv,
getTerminalSessionTimeout,
isAuthorizedTargetHost,
sanitizeSshArgs,
@ -401,7 +402,7 @@ async function handleCommand(ws, command, userId) {
cols: 80,
rows: 30,
cwd: process.env.HOME,
env: {},
env: getTerminalProcessEnv(),
};
// NOTE: - Initiates a process within the Terminal container

View file

@ -1,5 +1,13 @@
export const MAX_TERMINAL_SESSION_TIMEOUT_SECONDS = 8 * 60 * 60;
const DEFAULT_TERMINAL_PATH = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin';
export function getTerminalProcessEnv(environment = process.env) {
return {
PATH: environment.PATH || DEFAULT_TERMINAL_PATH,
};
}
export function getTerminalSessionTimeout() {
return MAX_TERMINAL_SESSION_TIMEOUT_SECONDS;
}

View file

@ -4,6 +4,7 @@ import {
MAX_TERMINAL_SESSION_TIMEOUT_SECONDS,
extractSshArgs,
extractTargetHost,
getTerminalProcessEnv,
getTerminalSessionTimeout,
isAuthorizedTargetHost,
normalizeHostForAuthorization,
@ -11,6 +12,32 @@ import {
validateSshArgs,
} from './terminal-utils.js';
test('getTerminalProcessEnv preserves the PATH needed by SSH proxy commands', () => {
assert.deepEqual(getTerminalProcessEnv({
PATH: '/usr/local/bin:/usr/bin:/bin',
APP_KEY: 'must-not-be-inherited',
}), {
PATH: '/usr/local/bin:/usr/bin:/bin',
});
});
test('getTerminalProcessEnv uses the default PATH when PATH is absent', () => {
assert.deepEqual(getTerminalProcessEnv({
APP_KEY: 'must-not-be-inherited',
}), {
PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
});
});
test('getTerminalProcessEnv uses the default PATH when PATH is empty', () => {
assert.deepEqual(getTerminalProcessEnv({
PATH: '',
APP_KEY: 'must-not-be-inherited',
}), {
PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
});
});
test('extractTargetHost normalizes quoted IPv4 hosts from generated ssh commands', () => {
const sshArgs = extractSshArgs(
"timeout 3600 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ServerAliveInterval=20 -o ConnectTimeout=10 'root'@'10.0.0.5' 'bash -se' << \\\\$abc\necho hi\nabc"