update:
This commit is contained in:
@@ -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:
|
||||
|
||||
23
src/cli.js
23
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,
|
||||
|
||||
@@ -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");
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user