Codex CLI 服务器无痕运行教程:API Key 不落盘,退出即清理

Linux 终端临时运行 Codex CLI:不写配置、不保存历史、退出自动清理

前言

在服务器或容器中使用 Codex CLI 时,有时不希望执行全局安装,也不希望 API Key、配置文件、npm 缓存和 Codex 会话长期保存在系统中。

本文介绍一种临时运行方案,具有以下特点:

  • 不全局安装 Codex CLI
  • API Key 不直接写入命令行
  • API Key 不进入 Bash 历史记录
  • 不创建长期使用的 ~/.codex/config.toml
  • npm 缓存、Codex 配置和会话统一存放到临时目录
  • 退出 Codex 后自动删除临时文件
  • 支持自定义 OpenAI 兼容接口
  • 可选全自动执行模式

需要注意的是,这种方式只能尽量减少本地文件痕迹,并不能实现法证意义上的"完全无痕"。


一、检查 Node.js 环境

Codex CLI 可以通过 npm 和 npx 临时运行,因此需要先确认服务器已经安装 Node.js。

在 Linux 终端中执行:

bash 复制代码
node -v
npm -v
npx -v

正常情况下会分别输出 Node.js、npm 和 npx 的版本号,例如:

text 复制代码
v20.11.1
10.2.4
10.2.4

如果出现:

text 复制代码
node: command not found

说明当前系统尚未安装 Node.js,需要先安装 Node.js 后再继续。


二、检查临时目录空间

最开始可能会考虑使用 /dev/shm,因为它通常是内存文件系统。但是很多 Docker 容器中的 /dev/shm 默认只有 64 MB,很容易出现空间不足。

执行:

bash 复制代码
df -h /dev/shm /tmp "$PWD"

示例输出:

text 复制代码
Filesystem      Size  Used Avail Use% Mounted on
shm              64M     0   64M   0% /dev/shm
overlay         200G  2.2G  198G   2% /
/dev/vdc        196G  5.4G  191G   3% /mnt/workspace

可以看到:

  • /dev/shm 只有 64 MB,不适合下载 Codex npm 包
  • /tmp 所在分区有接近 198 GB 可用空间
  • 当前工作区也有足够空间

因此,本文选择使用 /tmp 创建临时目录。

如果使用 /dev/shm 时出现以下错误:

text 复制代码
npm ERR! code ENOSPC
npm ERR! syscall write
npm ERR! nospc ENOSPC: no space left on device

说明不是 npm 或 API Key 的问题,而是 /dev/shm 空间不足。

可以先清理之前失败创建的目录:

bash 复制代码
rm -rf /dev/shm/codex-run-*

三、进入不保存历史记录的临时 Shell

执行:

bash 复制代码
HISTFILE=/dev/null bash --noprofile --norc

该命令会启动一个新的 Bash Shell:

  • HISTFILE=/dev/null:不将命令写入历史文件
  • --noprofile:不读取登录配置文件
  • --norc:不读取 .bashrc

进入后,终端提示符可能变成:

text 复制代码
bash-5.0$

这属于正常现象。

需要注意,关闭历史文件并不代表所有操作都绝对不会被记录。如果服务器启用了堡垒机审计、SSH 录屏、auditd 或其他系统级监控,管理员仍然可能看到相关操作。


四、临时启动 Codex CLI

复制并执行下面整段脚本:

bash 复制代码
(
    set -Eeuo pipefail
    umask 077

    TMPROOT="$(mktemp -d /tmp/codex-run-XXXXXX)"

    cleanup() {
        unset OPENAI_API_KEY
        rm -rf -- "$TMPROOT"
    }

    trap cleanup EXIT HUP INT TERM

    export TMPDIR="$TMPROOT/tmp"
    export npm_config_cache="$TMPROOT/npm-cache"
    export CODEX_HOME="$TMPROOT/codex-home"

    mkdir -p "$TMPDIR" "$npm_config_cache" "$CODEX_HOME"

    read -rsp "请输入 API Key: " OPENAI_API_KEY
    printf '\n'
    export OPENAI_API_KEY

    npx --yes --package=@openai/codex@latest codex \
        -c 'model_provider="proxy"' \
        -c 'model="gpt-5.5"' \
        -c 'review_model="gpt-5.5"' \
        -c 'model_reasoning_effort="xhigh"' \
        -c 'history.persistence="none"' \
        -c 'analytics.enabled=false' \
        -c 'model_providers.proxy.name="OpenAI Proxy"' \
        -c 'model_providers.proxy.base_url="http://43.155.161.229:8080"' \
        -c 'model_providers.proxy.wire_api="responses"' \
        -c 'model_providers.proxy.env_key="OPENAI_API_KEY"'
)

执行后会出现:

text 复制代码
请输入 API Key:

此时粘贴 API Key,然后按回车。

输入过程中,终端不会显示星号,也不会显示任何字符,这是 read -s 的正常行为。


五、脚本工作原理

1. 使用子 Shell 隔离运行环境

最外层使用:

bash 复制代码
(
    ...
)

括号中的命令会在子 Shell 中运行。

Codex 退出后,子 Shell 随之结束,内部设置的环境变量不会继续保留在外层终端中。


2. 开启严格错误处理

bash 复制代码
set -Eeuo pipefail

各参数作用如下:

  • -E:让错误陷阱在函数和子 Shell 中生效
  • -e:命令执行失败时立即退出
  • -u:使用未定义变量时报错
  • -o pipefail:管道中任意命令失败时,整个管道视为失败

这样可以避免脚本在异常状态下继续执行。


3. 限制临时文件权限

bash 复制代码
umask 077

这会让新创建的文件和目录默认仅当前用户可访问。

通常对应:

text 复制代码
目录权限:700
文件权限:600

4. 创建随机临时目录

bash 复制代码
TMPROOT="$(mktemp -d /tmp/codex-run-XXXXXX)"

系统会创建类似下面的临时目录:

text 复制代码
/tmp/codex-run-a8Kd92

随机后缀可以避免多个任务之间发生目录冲突。


5. 设置退出清理函数

bash 复制代码
cleanup() {
    unset OPENAI_API_KEY
    rm -rf -- "$TMPROOT"
}

清理函数会完成两件事:

  1. 删除当前子 Shell 中的 OPENAI_API_KEY
  2. 删除整个 Codex 临时目录

然后通过下面的命令注册清理行为:

bash 复制代码
trap cleanup EXIT HUP INT TERM

无论是正常退出、按 Ctrl+C,还是终端收到中断信号,脚本都会尽量执行清理函数。


6. 将 npm 缓存放入临时目录

bash 复制代码
export npm_config_cache="$TMPROOT/npm-cache"

正常情况下,npm 会在用户目录中创建缓存,例如:

text 复制代码
~/.npm

通过重新设置 npm_config_cache,本次运行产生的 npm 缓存会被写入:

text 复制代码
/tmp/codex-run-xxxxxx/npm-cache

退出后统一删除。


7. 将 Codex 数据放入临时目录

bash 复制代码
export CODEX_HOME="$TMPROOT/codex-home"

Codex 的配置、状态和会话数据会被引导到临时目录,而不是默认的:

text 复制代码
~/.codex

这样可以避免在用户主目录中长期保留 Codex 文件。


8. 安全读取 API Key

bash 复制代码
read -rsp "请输入 API Key: " OPENAI_API_KEY

参数含义:

  • -r:不处理反斜杠转义
  • -s:静默输入,不在终端显示
  • -p:显示输入提示

读取完成后执行:

bash 复制代码
export OPENAI_API_KEY

这样 Codex 子进程可以通过环境变量读取密钥。

相比下面这种写法:

bash 复制代码
export OPENAI_API_KEY="sk-xxxxxx"

使用 read -s 可以避免 API Key 直接出现在命令历史中。


9. 使用 npx 临时运行 Codex

bash 复制代码
npx --yes --package=@openai/codex@latest codex

参数说明:

  • --yes:自动确认 npm 临时安装提示
  • --package=@openai/codex@latest:临时下载最新 Codex CLI
  • codex:运行包中的 Codex 命令

这种方式不会执行:

bash 复制代码
npm install -g @openai/codex

因此不会将 Codex 全局安装到系统。

不过,Codex 运行期间仍然需要把 npm 包下载到临时目录。退出后,该临时目录会自动删除。


六、自定义模型与代理接口

脚本中使用了自定义模型供应商:

bash 复制代码
-c 'model_provider="proxy"'

并配置:

bash 复制代码
-c 'model_providers.proxy.name="OpenAI Proxy"'
-c 'model_providers.proxy.base_url="http://43.155.161.229:8080"'
-c 'model_providers.proxy.wire_api="responses"'
-c 'model_providers.proxy.env_key="OPENAI_API_KEY"'

各项含义如下:

配置项 作用
model_provider="proxy" 使用名为 proxy 的自定义供应商
name="OpenAI Proxy" 自定义供应商显示名称
base_url OpenAI 兼容接口地址
wire_api="responses" 使用 Responses API 协议
env_key="OPENAI_API_KEY" 从环境变量读取 API Key

模型配置如下:

bash 复制代码
-c 'model="gpt-5.5"'
-c 'review_model="gpt-5.5"'
-c 'model_reasoning_effort="xhigh"'

如果代理服务不支持这些模型名称,需要根据代理平台实际提供的模型名称进行修改。


七、关闭 Codex 本地历史记录

脚本中设置:

bash 复制代码
-c 'history.persistence="none"'

用于关闭 Codex 的本地对话历史持久化。

同时设置:

bash 复制代码
-c 'analytics.enabled=false'

用于关闭分析数据选项。

即使设置了这些参数,代理服务器、网络网关或服务提供方仍然可能保存请求日志,因此它们不能保证请求在服务端完全不被记录。


八、退出 Codex

可以在 Codex 中输入:

text 复制代码
/exit

也可以按:

text 复制代码
Ctrl+D

Codex 退出后,脚本会自动执行:

bash 复制代码
unset OPENAI_API_KEY
rm -rf -- "$TMPROOT"

临时目录会被删除,例如:

text 复制代码
/tmp/codex-run-a8Kd92

可以在外层 Shell 中检查:

bash 复制代码
ls -ld /tmp/codex-run-*

如果没有其他运行中的 Codex 临时任务,通常会显示:

text 复制代码
ls: cannot access '/tmp/codex-run-*': No such file or directory

九、开启全自动执行模式

如果希望 Codex 执行命令时不再询问授权,可以在 codex 后加入:

bash 复制代码
--dangerously-bypass-approvals-and-sandbox

完整位置如下:

bash 复制代码
npx --yes --package=@openai/codex@latest codex \
    --dangerously-bypass-approvals-and-sandbox \
    -c 'model_provider="proxy"' \
    -c 'model="gpt-5.5"' \
    -c 'review_model="gpt-5.5"' \
    -c 'model_reasoning_effort="xhigh"' \
    -c 'history.persistence="none"' \
    -c 'analytics.enabled=false' \
    -c 'model_providers.proxy.name="OpenAI Proxy"' \
    -c 'model_providers.proxy.base_url="http://43.155.161.229:8080"' \
    -c 'model_providers.proxy.wire_api="responses"' \
    -c 'model_providers.proxy.env_key="OPENAI_API_KEY"'

这个参数会跳过审批和沙箱保护,Codex 可以直接:

  • 修改文件
  • 删除文件
  • 执行终端命令
  • 安装依赖
  • 运行项目脚本

因此,只建议在以下环境中使用:

  • 临时容器
  • 隔离服务器
  • 已备份项目
  • 明确信任的代码仓库

不要在包含重要文件、生产数据或敏感凭据的环境中随意启用。


十、常见问题

问题一:codex: command not found

报错:

text 复制代码
bash: codex: command not found

原因是 Codex CLI 没有安装,或者不在 PATH 中。

本文使用下面的方式临时运行,因此不需要全局安装:

bash 复制代码
npx --yes --package=@openai/codex@latest codex

问题二:ENOSPC: no space left on device

报错:

text 复制代码
npm WARN tar TAR_ENTRY_ERROR ENOSPC: no space left on device
npm ERR! code ENOSPC
npm ERR! syscall write

如果 npm 缓存目录位于 /dev/shm,通常是因为 Docker 默认的共享内存只有 64 MB。

检查:

bash 复制代码
df -h /dev/shm /tmp

解决方法是把临时目录从:

text 复制代码
/dev/shm

改为:

text 复制代码
/tmp

问题三:输入 API Key 时没有显示

这是正常现象。

因为命令使用了:

bash 复制代码
read -s

输入内容不会显示在屏幕上,也不会显示星号。粘贴完成后直接按回车即可。


问题四:退出后是否真的删除了

可以检查:

bash 复制代码
find /tmp -maxdepth 1 -type d -name 'codex-run-*' -ls

如果没有输出,说明临时目录已经删除。

不过,如果进程被强制执行 kill -9,Shell 无法捕获该信号,trap 可能来不及执行。此时可以手动清理:

bash 复制代码
rm -rf /tmp/codex-run-*

问题五:是否绝对不会留下任何痕迹

不能保证绝对无痕。

本文方案主要避免:

  • API Key 写入 Bash 历史
  • API Key 写入 Codex 配置文件
  • Codex 全局安装
  • npm 缓存长期保留
  • Codex 会话文件长期保留
  • 环境变量在退出后继续存在

但以下位置仍可能保存记录:

  • SSH 堡垒机
  • 终端录屏
  • Linux auditd
  • Docker 宿主机审计
  • 网络代理日志
  • API 中转服务日志
  • 云平台操作审计
  • Shell 进程运行期间的内存
  • 服务器管理员读取的进程环境变量

因此,更准确的说法是"减少本地持久化痕迹",而不是"完全无痕"。


十一、HTTP 接口的安全风险

示例配置使用:

text 复制代码
http://43.155.161.229:8080

这是明文 HTTP,而不是 HTTPS。

使用 HTTP 意味着以下内容可能以明文形式在网络中传输:

  • API Key
  • 提示词
  • 项目代码片段
  • 模型返回内容
  • 文件内容
  • 终端执行上下文

建议将接口部署为:

text 复制代码
https://your-domain.example.com

并配置有效的 TLS 证书。

如果只能使用 HTTP,应确保它运行在可信的内网、VPN 或加密隧道中,并明确了解其中风险。


十二、完整操作流程总结

第一步:检查环境

bash 复制代码
node -v
npm -v
npx -v

第二步:检查磁盘空间

bash 复制代码
df -h /dev/shm /tmp "$PWD"

第三步:进入无历史临时 Shell

bash 复制代码
HISTFILE=/dev/null bash --noprofile --norc

第四步:执行临时运行脚本

bash 复制代码
(
    set -Eeuo pipefail
    umask 077

    TMPROOT="$(mktemp -d /tmp/codex-run-XXXXXX)"

    cleanup() {
        unset OPENAI_API_KEY
        rm -rf -- "$TMPROOT"
    }

    trap cleanup EXIT HUP INT TERM

    export TMPDIR="$TMPROOT/tmp"
    export npm_config_cache="$TMPROOT/npm-cache"
    export CODEX_HOME="$TMPROOT/codex-home"

    mkdir -p "$TMPDIR" "$npm_config_cache" "$CODEX_HOME"

    read -rsp "请输入 API Key: " OPENAI_API_KEY
    printf '\n'
    export OPENAI_API_KEY

    npx --yes --package=@openai/codex@latest codex \
        -c 'model_provider="proxy"' \
        -c 'model="gpt-5.5"' \
        -c 'review_model="gpt-5.5"' \
        -c 'model_reasoning_effort="xhigh"' \
        -c 'history.persistence="none"' \
        -c 'analytics.enabled=false' \
        -c 'model_providers.proxy.name="OpenAI Proxy"' \
        -c 'model_providers.proxy.base_url="http://43.155.161.229:8080"' \
        -c 'model_providers.proxy.wire_api="responses"' \
        -c 'model_providers.proxy.env_key="OPENAI_API_KEY"'
)

第五步:退出

在 Codex 中输入:

text 复制代码
/exit

或者按:

text 复制代码
Ctrl+D

脚本会自动清除 API Key,并删除本次运行产生的临时目录。


结语

通过 npx、临时 Shell、CODEX_HOME、npm 临时缓存和 trap 清理机制,可以在 Linux 服务器或 Docker 容器中临时运行 Codex CLI,同时尽量减少本地持久化文件。

该方案适用于:

  • 临时服务器
  • Docker 容器
  • 公共计算节点
  • 不能全局安装软件的环境
  • 希望退出后自动清理的开发场景

不过,安全性不仅取决于本地文件,还取决于网络传输、代理服务、服务器审计和平台日志。生产环境中应优先使用 HTTPS、短期密钥、最小权限和可信代理服务。


文章标签

text 复制代码
Linux
Codex
OpenAI
Node.js
npm
npx
Docker
服务器
AI编程
命令行工具