function quote(value: string): string { return `'${value.replace(/'/g, `'"'"'`)}'` } // SSH may forward LANG/LC_* through the user's SendEnv configuration. // Undefined entries also remove inherited keys when merged by the command runner. export function remoteShellEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv { const result = { ...env } for (const key of Object.keys(result)) { if (key === 'LANGUAGE' || key.startsWith('LC_')) result[key] = undefined } return { ...result, LANG: 'C', LC_ALL: 'C' } } export function remoteShellCommand(command: string): string { const script = [ 'selected_locale=C', // Probe under C so an inherited, unavailable locale cannot break the probe. 'available_locales=$(locale -a 2>/dev/null) || available_locales=', 'for candidate in $available_locales; do', ' case "$candidate" in C.utf8|C.UTF-8) selected_locale=$candidate; break ;;', ' *utf8|*UTF-8|*utf-8) if [ "$selected_locale" = C ]; then selected_locale=$candidate; fi ;;', ' esac', 'done', `exec env LANG="$selected_locale" LC_ALL="$selected_locale" LANGUAGE=C /bin/bash --noprofile --norc -c ${quote(command)}`, ].join('\n') return `env LANG=C LC_ALL=C LANGUAGE=C /bin/sh -c ${quote(script)}` }