90 lines
2.9 KiB
JavaScript
90 lines
2.9 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* 把 SSH 私钥转换为“单行 base64”,用于放入 Gitea Secrets(例如 DEV_SSH_KEY_B64)。
|
||
*
|
||
* 用法:
|
||
* 1) 从文件读取:
|
||
* node scripts/ssh-key-to-b64.mjs ~/.ssh/deploy_key
|
||
*
|
||
* 2) 从 stdin 读取(直接粘贴私钥内容,结束后按 Ctrl+D):
|
||
* node scripts/ssh-key-to-b64.mjs -
|
||
*
|
||
* 3) 输出同时复制到剪贴板(仅 macOS,需系统自带 pbcopy):
|
||
* node scripts/ssh-key-to-b64.mjs ~/.ssh/deploy_key --clipboard
|
||
*
|
||
* 注意:
|
||
* - 请不要把输出写入仓库或提交到 git。
|
||
* - 工作流会优先使用 *_SSH_KEY_B64(更稳,避免多行换行丢失)。
|
||
*/
|
||
|
||
import fs from 'node:fs';
|
||
import { spawnSync } from 'node:child_process';
|
||
|
||
function printHelp() {
|
||
console.log(`用法:
|
||
node scripts/ssh-key-to-b64.mjs <私钥文件路径> [--clipboard] [--stdout]
|
||
node scripts/ssh-key-to-b64.mjs - [--clipboard] [--stdout]
|
||
|
||
示例:
|
||
node scripts/ssh-key-to-b64.mjs ~/.ssh/deploy_key
|
||
node scripts/ssh-key-to-b64.mjs - --clipboard
|
||
node scripts/ssh-key-to-b64.mjs ~/.ssh/deploy_key --clipboard --stdout
|
||
`);
|
||
}
|
||
|
||
const args = process.argv.slice(2);
|
||
const clipboard = args.includes('--clipboard') || args.includes('-c');
|
||
const forceStdout = args.includes('--stdout');
|
||
const help = args.includes('--help') || args.includes('-h');
|
||
const input = args.find((a) => !a.startsWith('-'));
|
||
|
||
if (help || !input) {
|
||
printHelp();
|
||
process.exit(help ? 0 : 1);
|
||
}
|
||
|
||
function readAllStdin() {
|
||
return fs.readFileSync(0);
|
||
}
|
||
|
||
let buf;
|
||
try {
|
||
if (input === '-') {
|
||
buf = readAllStdin();
|
||
} else {
|
||
buf = fs.readFileSync(input);
|
||
}
|
||
} catch (e) {
|
||
console.error(`读取失败:${String(e?.message || e)}`);
|
||
process.exit(1);
|
||
}
|
||
|
||
// 重要:按“原始字节”做 base64,避免任何编码/换行处理导致私钥内容变化
|
||
// 这样工作流解码后能 100% 还原原文件内容
|
||
const asText = buf.toString('utf8');
|
||
if (!asText.includes('BEGIN') || !asText.includes('PRIVATE KEY')) {
|
||
console.error('提示:输入内容看起来不像 SSH 私钥(未检测到 PRIVATE KEY 头部)。仍会继续转换,但请确认输入正确。');
|
||
}
|
||
|
||
const b64 = buf.toString('base64');
|
||
|
||
if (clipboard) {
|
||
if (process.platform !== 'darwin') {
|
||
console.error('当前不是 macOS,无法使用 --clipboard(需要 pbcopy)。将仅输出到 stdout。');
|
||
} else {
|
||
const r = spawnSync('pbcopy', [], { input: b64, encoding: 'utf8' });
|
||
if (r.status !== 0) {
|
||
console.error(`复制到剪贴板失败:pbcopy 退出码=${r.status}`);
|
||
} else {
|
||
console.error('已复制到剪贴板:请粘贴到 Gitea Secrets(例如 DEV_SSH_KEY_B64)。');
|
||
}
|
||
}
|
||
}
|
||
|
||
// 默认:如果使用了 --clipboard,就不再把超长 base64 打到终端(避免影响后续命令输出)。
|
||
// 如需同时打印,请加 --stdout。
|
||
if (!clipboard || forceStdout || process.platform !== 'darwin') {
|
||
process.stdout.write(b64 + '\n');
|
||
}
|
||
|