方案一:/dev/urandom + tr + fold + head(推薦,批量、可控複雜度)
# 僅字母數字,長度 10,生成 10 個
cat /dev/urandom | LC_ALL=C tr -dc '[:alnum:]' | fold -w 10 | head -10
# 輸出示例:
Si1N9kUyuZ
ddzsRXFgxA
caDRBRT4Px
...
參數解析
| 組件 | 作用 |
/dev/urandom | 非阻塞隨機數源(熵池不足不阻塞,適合腳本) |
LC_ALL=C | 強制 C locale,避免多字節字符導致 tr 行為異常 |
tr -dc '[:alnum:]' | 刪除(-d)補集(-c),僅保留字母數字 |
fold -w 10 | 固寬 10 字符換行 |
head -10 | 取前 10 行 |
進階:含特殊符號的高強度密碼
cat /dev/urandom | LC_ALL=C tr -dc '[:graph:]' | fold -w 10 | head -10
# [:graph:] = 可見字符(含標點、符號),輸出示例:
y#@uDo.g-w
RP\oq.8?)e
2R~CCIsLPr
...
方案二:/proc/sys/kernel/random/uuid(單次、標準 UUID v4)
cat /proc/sys/kernel/random/uuid | tr -d '-'
# 輸出:d9d01c59d22f4ebbac16b759103f4fc6 (32 位十六進制)
- 優點:內核級 CSPRNG、標準格式、無需管道組合。
- 缺點:每次只能生成 1 個、固定 128 位、僅十六進制字符集。
方案三:OpenSSL(跨平台、可指定 Base64/Hex)
# Base64,長度 16 字節 → 24 字符
openssl rand -base64 16
# Hex,長度 16 字節 → 32 字符
openssl rand -hex 16
選型建議
| 場景 | 推薦方案 |
| 批量生成測試賬號、API Key | 方案一 [:alnum:] 或 [:graph:] |
| 需符合 RFC 4122 UUID 標準 | 方案二 /proc/.../uuid |
| 跨平台腳本(含 Windows Git Bash) | 方案三 openssl rand |
| 嵌入式/極簡環境無 OpenSSL | 方案一(BusyBox 通常內建 tr/fold/head) |
安全提醒:生產系統密鑰生成建議使用語言級 CSPRNG(如 Java SecureRandom、Python secrets、Go crypto/rand),而非依賴 Shell 管道。