From 9f025617b3d1cef6f9f33777808c11e90afb74c0 Mon Sep 17 00:00:00 2001 From: echoVic Date: Mon, 9 Feb 2026 19:42:15 +0800 Subject: [PATCH] fix: allow root execution in container/sandbox/CI environments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, blade unconditionally blocked any root user (uid === 0), which prevented running in Docker containers, CI pipelines, and sandbox environments where root is the default user. Now we distinguish between: - sudo escalation (SUDO_USER set) → still blocked for safety - native root (containers/CI) → allowed Added BLADE_ALLOW_ROOT=1 escape hatch for edge cases. --- packages/cli/src/blade.tsx | 43 +++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/packages/cli/src/blade.tsx b/packages/cli/src/blade.tsx index 16aed9f6..c9f81228 100644 --- a/packages/cli/src/blade.tsx +++ b/packages/cli/src/blade.tsx @@ -40,21 +40,36 @@ if (debugIndex !== -1) { export async function main() { // 🛡️ 防止使用 sudo 运行(避免创建 root 拥有的文件) + // 但允许在容器/沙箱/CI 等天然 root 环境中运行 if (process.getuid && process.getuid() === 0) { - console.error(''); - console.error('❌ 请不要使用 sudo 运行 blade'); - console.error(''); - console.error('原因:'); - console.error(' 使用 sudo 会创建属于 root 的配置文件,'); - console.error(' 导致普通用户无法访问。'); - console.error(''); - console.error('正确用法:'); - console.error(' blade # 直接运行,不要加 sudo'); - console.error(''); - console.error('如果遇到权限错误,请运行:'); - console.error(' sudo chown -R $USER:$USER ~/.blade/'); - console.error(''); - process.exit(1); + const isSudo = !!process.env.SUDO_USER; + const isContainer = + !!process.env.container || + !!process.env.DOCKER_CONTAINER || + !!process.env.KUBERNETES_SERVICE_HOST; + const isCI = !!process.env.CI; + const isAllowRoot = !!process.env.BLADE_ALLOW_ROOT; + + // 只有通过 sudo 提权运行时才阻止,天然 root 环境放行 + if (isSudo && !isAllowRoot) { + console.error(''); + console.error('❌ 请不要使用 sudo 运行 blade'); + console.error(''); + console.error('原因:'); + console.error(' 使用 sudo 会创建属于 root 的配置文件,'); + console.error(' 导致普通用户无法访问。'); + console.error(''); + console.error('正确用法:'); + console.error(' blade # 直接运行,不要加 sudo'); + console.error(''); + console.error('如果遇到权限错误,请运行:'); + console.error(' sudo chown -R $USER:$USER ~/.blade/'); + console.error(''); + console.error('如果你确实需要以 root 运行(容器/CI),设置环境变量:'); + console.error(' BLADE_ALLOW_ROOT=1 blade'); + console.error(''); + process.exit(1); + } } // 初始化优雅退出处理器(捕获 uncaughtException/unhandledRejection/SIGTERM)