From 03a39730144d7dbcebdec6a6829bb87f7932aeb5 Mon Sep 17 00:00:00 2001 From: hanruo <552455797@qq.com> Date: Wed, 15 Apr 2026 15:49:47 +0800 Subject: [PATCH] update: --- README.md | 4 +++- src/cli.js | 23 +++++++++++++++++++++-- test/frp-config.test.js | 10 +++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 40ec64b..a95411e 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,8 @@ SSH 示例,本机 ssh 监听 `22`,远端暴露 `17227`: server-config frp add ssh --local-port 22 --remote-port 17227 --restart ``` +实际写入 frp 的 `name` 会自动追加随机后缀,例如 `ssh-aaa12312`,避免与已有代理重名。删除代理时使用 `server-config frp list` 看到的完整名称。 + MySQL 示例: ```bash @@ -117,7 +119,7 @@ server-config frp list 删除代理: ```bash -server-config frp remove mysql --restart +server-config frp remove mysql-aaa12312 --restart ``` 重启 frpc: diff --git a/src/cli.js b/src/cli.js index e48f4e1..65a9237 100644 --- a/src/cli.js +++ b/src/cli.js @@ -3,6 +3,7 @@ const fs = require("node:fs"); const os = require("node:os"); const path = require("node:path"); +const { randomBytes } = require("node:crypto"); const { spawnSync } = require("node:child_process"); const DEFAULT_FRP_VERSION = "0.58.1"; @@ -267,8 +268,9 @@ function addFrpProxy(name, flags, runner) { } const config = parseFrpConfig(fs.readFileSync(configPath, "utf8")); - config.sections.set(name, { - name, + const proxyName = createUniqueProxyName(name, config.sections); + config.sections.set(proxyName, { + name: proxyName, values: { type: stringFlag(flags, "type", "tcp"), local_ip: stringFlag(flags, "local-ip", "127.0.0.1"), @@ -277,10 +279,26 @@ function addFrpProxy(name, flags, runner) { }, }); + console.log(`Added frp proxy ${proxyName}`); writeFile(configPath, renderParsedFrpConfig(config), runner); restartServiceIfRequested(flags, runner); } +function createUniqueProxyName(baseName, sections) { + for (let attempt = 0; attempt < 10; attempt += 1) { + const name = `${baseName}-${randomString(8)}`; + if (!sections.has(name)) { + return name; + } + } + + throw new Error(`Could not generate a unique proxy name for ${baseName}.`); +} + +function randomString(length) { + return randomBytes(Math.ceil(length / 2)).toString("hex").slice(0, length); +} + function removeFrpProxy(name, flags, runner) { if (!name) { throw new Error("frp remove requires a proxy name."); @@ -705,6 +723,7 @@ function fail(message) { module.exports = { main, + createUniqueProxyName, parseArgs, parseFrpConfig, renderParsedFrpConfig, diff --git a/test/frp-config.test.js b/test/frp-config.test.js index 8762e3a..fc64b58 100644 --- a/test/frp-config.test.js +++ b/test/frp-config.test.js @@ -3,7 +3,7 @@ const assert = require("node:assert/strict"); const test = require("node:test"); -const { parseFrpConfig, renderParsedFrpConfig } = require("../src/cli"); +const { createUniqueProxyName, parseFrpConfig, renderParsedFrpConfig } = require("../src/cli"); test("parses and renders frp proxy sections", () => { const parsed = parseFrpConfig(`server_addr = "81.70.134.9" @@ -62,3 +62,11 @@ remotePort = 17227 assert.equal(parsed.sections.get("ssh").values.local_port, 22); assert.equal(parsed.sections.get("ssh").values.remote_port, 17227); }); + +test("generates unique proxy names with random suffixes", () => { + const sections = new Map(); + const name = createUniqueProxyName("ssh", sections); + + assert.match(name, /^ssh-[a-f0-9]{8}$/); + assert.notEqual(name, "ssh"); +});