This commit is contained in:
2026-04-15 15:49:47 +08:00
parent e3f83f4746
commit 03a3973014
3 changed files with 33 additions and 4 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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");
});