不建议用普通Shell变量长期存储敏感凭证,因其易被ps、env等命令泄露且无法加密;应优先从权限严格的文件读取、交互输入或密钥管理工具获取,必要时使用混淆变量名、及时unset并禁用历史记录。

不建议用普通 Shell 变量长期存储敏感凭证(如密码、API Key、Token),因为变量值会留在内存中,可能被 ps、env、set 或进程崩溃转储泄露,且无法加密保护。但若确需在脚本或临时会话中使用,必须严格遵循安全实践。
避免明文硬编码和直接赋值
不要这样写:
-
API_KEY=abc123xyz—— 值直接出现在命令历史、脚本源码、进程参数中 -
echo $API_KEY > /tmp/debug.log—— 可能意外落盘
这类操作会让凭证暴露在多个攻击面,包括 shell 历史记录、系统日志、/proc/<pid>/environ、其他用户执行的 ps auxfe 等。
推荐的安全替代方式
优先采用以下更可控的方法:
-
从文件读取(权限严格限制):把凭证存入仅属主可读的文件(
chmod 600 ~/.secret.env),再用source或cat+read加载,不经过命令行参数传递 -
使用
read -s交互输入:运行时手动键入,不回显、不进历史,适合一次性调试或人工触发脚本read -s -p "Enter password: " PASSWORD; echo -
调用密钥管理工具:如
pass(password store)、gopass、1password CLI或企业级 Vault,通过子进程输出解密后的值:PASSWORD=$(pass show myapp/api-key) -
环境隔离+临时导出:仅在必要子进程前导出,且立即 unset;不用
export全局污染会话API_KEY=$(cat ~/.api_key); export API_KEY; ./mytool.sh; unset API_KEY
如果必须用变量,至少做到三点
若受限于环境不得不暂存为变量,请确保:
- 变量名不包含敏感词(避免
PASSWORD、SECRET等易被 grep 匹配的名称),可用混淆名如_X9z2 - 使用
unset及时清理:unset _X9z2,尤其在脚本末尾或异常退出 trap 中补上 - 禁止将含变量的命令写入
~/.bash_history:执行前临时设HISTCONTROL=ignorespace,然后以空格开头运行赋值语句(如API_KEY=xxx)
真正安全的凭证管理,核心不是“怎么存变量”,而是“不让凭证以明文形式出现在 Shell 进程上下文中”。用外部可信服务或最小权限文件读取,才是生产环境的标准做法。


















