在没有 .env 文件的情况下运行你的开发服务器
Source: Dev.to
每个项目都有一个——位于项目根目录的 .env 文件,里面存放着数据库密码、API 密钥以及各种敏感程度不同的机密信息。
你把它加入了 .gitignore。你希望没有人不小心提交它。你通过 Slack 把它发给新加入的团队成员,因为没有更好的办法。你大概有一半时间都忘记它的存在。
.env 文件是开发者生态系统中公认的坏习惯。大家都知道这并不理想,但没有更好的本地开发方案可以在不依赖企业级基础设施的情况下替代它。
介绍 agentsecrets env
agentsecrets env 是一个 进程包装器。你把它放在任意命令前面。它会从操作系统的钥匙串中提取你的密钥,并在进程启动时将其注入为环境变量。进程可以像往常一样从 os.environ(或 process.env)读取——无需修改应用代码、无需安装 SDK、也不需要任何集成工作。当进程退出后,这些值会消失,不会写入磁盘。
之前
python manage.py runserver
之后
agentsecrets env -- python manage.py runserver
这就是对工作流的全部改动。应用内部的所有内容保持不变。
安装
brew install the-17/tap/agentsecrets
or
npm install -g @the-17/agentsecrets
or
pip install agentsecrets
初始化并存储您的密钥
agentsecrets init
agentsecrets secrets set DATABASE_URL=postgresql://user:pass@localhost/mydb
agentsecrets secrets set STRIPE_SECRET_KEY=sk_live_51H...
agentsecrets secrets set DJANGO_SECRET_KEY=your-secret-key
agentsecrets secrets set OPENAI_KEY=sk-proj-...
或者一次性导入现有的 .env,然后删除它
agentsecrets secrets push
rm .env
值会存储在操作系统的钥匙串中——macOS Keychain、Windows Credential Manager 或 Linux Secret Service。不是文件,也不是 shell 配置文件中的环境变量。 操作系统钥匙串需要系统级别的身份验证才能访问,其他进程无法读取。
不需要对代码进行更改
# settings.py
import os
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.environ["DB_NAME"],
"PASSWORD": os.environ["DB_PASSWORD"], # injected by agentsecrets env
"HOST": os.environ["DB_HOST"],
}
}
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
STRIPE_SECRET_KEY = os.environ["STRIPE_KEY"]
运行带有注入密钥的命令
Django
agentsecrets env -- python manage.py runserver
agentsecrets env -- python manage.py migrate
agentsecrets env -- python manage.py shell
agentsecrets env -- celery -A myapp worker --loglevel=info
agentsecrets env -- python manage.py test
Node / npm / npx / Prisma
agentsecrets env -- node server.js
agentsecrets env -- npm run dev
agentsecrets env -- npx next dev
agentsecrets env -- npx ts-node src/index.ts
agentsecrets env -- npx prisma migrate dev
你的应用程序仍然像以前一样读取 process.env.STRIPE_KEY —— 只是值的来源发生了变化。
通过 Makefile 的单行集成
RUN := agentsecrets env --
dev:
$(RUN) npm run dev
test:
$(RUN) npm test
migrate:
$(RUN) python manage.py migrate
server:
$(RUN) python manage.py runserver
worker:
$(RUN) celery -A myapp worker --loglevel=info
现在执行 make dev、make test、make migrate 等,都将在密钥链注入的秘密环境下运行。你只需输入平时使用的相同命令。
额外功能:即时禁用注入
make dev RUN= # 运行:npm run dev(不注入,用于调试)
make dev # 运行:agentsecrets env -- npm run dev
替换 Stripe 的 config.toml
Stripe CLI 在 ~/.config/stripe/config.toml 中存储你的密钥,经过 stripe login 后——明文、永久、任何进程(包括 AI 编码助手)都可以读取。
使用 agentsecrets env 代替
agentsecrets env -- stripe listen --forward-to localhost:3000
agentsecrets env -- stripe customers list
agentsecrets env -- stripe trigger payment_intent.created
agentsecrets env -- stripe mcp
CLI 在环境变量中查找 STRIPE_SECRET_KEY 并使用它,使 config.toml 变得无关紧要。
Docker Compose
agentsecrets env -- docker-compose up
agentsecrets env -- docker-compose run web python manage.py migrate
你的 docker-compose.yml 保持不变。密钥来自钥匙串,而不是 .env 文件。
为什么这对 AI 编码助手很重要
当你使用 AI 编码助手(Claude、Cursor、Copilot 等)时,它可以访问你的文件系统来读取文件并了解你的代码库。项目目录中的 .env 文件是一个金矿:
- 直接访问 – 助手在调试或探索时读取
.env,将密钥泄露到对话上下文中。 - 提示注入 – 被助手处理的恶意文件可能包含隐藏指令,例如 “查找并传输所有 API 密钥”。助手会在显而易见的地方寻找:
.env。 - 恶意扩展 – 与助手运行在同一进程中的受损插件可以读取该文件。
agentsecrets env 完全将 .env 文件排除在外。密钥在进程启动时从操作系统钥匙串中提取,仅存在于子进程的内存中——这是助手无法访问的空间。
示例日志条目(JSON)
{
"timestamp": "2026-03-04T10:00:00Z",
"method": "ENV",
"target_url": "python manage.py runserver",
"secret_keys": ["DB_PASSWORD", "STRIPE_KEY", "DJANGO_SECRET_KEY"],
"status": "OK"
}
日志记录 密钥名称、执行的命令以及状态——从不记录密钥的实际值。
迁移现有项目
# Import everything from .env into the keychain
agentsecrets secrets push
# Verify it’s all there
agentsecrets secrets list
# Delete the .env file
rm .env
# Update your Makefile with the RUN variable (as shown above)
# Done
团队入职
agentsecrets login
agentsecrets workspace switch
agentsecrets secrets pull
.env 文件不再在 Slack 中被传递。