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
6 changed files with 40 additions and 4 deletions
+2 -1
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
@@ -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;
}
@@ -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"