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"
}
清理函数会完成两件事:
- 删除当前子 Shell 中的
OPENAI_API_KEY - 删除整个 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 CLIcodex:运行包中的 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编程
命令行工具