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
|
server-config frp add ssh --local-port 22 --remote-port 17227 --restart
|
||||||
```
|
```
|
||||||
|
|
||||||
|
实际写入 frp 的 `name` 会自动追加随机后缀,例如 `ssh-aaa12312`,避免与已有代理重名。删除代理时使用 `server-config frp list` 看到的完整名称。
|
||||||
|
|
||||||
MySQL 示例:
|
MySQL 示例:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -117,7 +119,7 @@ server-config frp list
|
|||||||
删除代理:
|
删除代理:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
server-config frp remove mysql --restart
|
server-config frp remove mysql-aaa12312 --restart
|
||||||
```
|
```
|
||||||
|
|
||||||
重启 frpc:
|
重启 frpc:
|
||||||
|
|||||||
23
src/cli.js
23
src/cli.js
@@ -3,6 +3,7 @@
|
|||||||
const fs = require("node:fs");
|
const fs = require("node:fs");
|
||||||
const os = require("node:os");
|
const os = require("node:os");
|
||||||
const path = require("node:path");
|
const path = require("node:path");
|
||||||
|
const { randomBytes } = require("node:crypto");
|
||||||
const { spawnSync } = require("node:child_process");
|
const { spawnSync } = require("node:child_process");
|
||||||
|
|
||||||
const DEFAULT_FRP_VERSION = "0.58.1";
|
const DEFAULT_FRP_VERSION = "0.58.1";
|
||||||
@@ -267,8 +268,9 @@ function addFrpProxy(name, flags, runner) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const config = parseFrpConfig(fs.readFileSync(configPath, "utf8"));
|
const config = parseFrpConfig(fs.readFileSync(configPath, "utf8"));
|
||||||
config.sections.set(name, {
|
const proxyName = createUniqueProxyName(name, config.sections);
|
||||||
name,
|
config.sections.set(proxyName, {
|
||||||
|
name: proxyName,
|
||||||
values: {
|
values: {
|
||||||
type: stringFlag(flags, "type", "tcp"),
|
type: stringFlag(flags, "type", "tcp"),
|
||||||
local_ip: stringFlag(flags, "local-ip", "127.0.0.1"),
|
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);
|
writeFile(configPath, renderParsedFrpConfig(config), runner);
|
||||||
restartServiceIfRequested(flags, 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) {
|
function removeFrpProxy(name, flags, runner) {
|
||||||
if (!name) {
|
if (!name) {
|
||||||
throw new Error("frp remove requires a proxy name.");
|
throw new Error("frp remove requires a proxy name.");
|
||||||
@@ -705,6 +723,7 @@ function fail(message) {
|
|||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
main,
|
main,
|
||||||
|
createUniqueProxyName,
|
||||||
parseArgs,
|
parseArgs,
|
||||||
parseFrpConfig,
|
parseFrpConfig,
|
||||||
renderParsedFrpConfig,
|
renderParsedFrpConfig,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
const assert = require("node:assert/strict");
|
const assert = require("node:assert/strict");
|
||||||
const test = require("node:test");
|
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", () => {
|
test("parses and renders frp proxy sections", () => {
|
||||||
const parsed = parseFrpConfig(`server_addr = "81.70.134.9"
|
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.local_port, 22);
|
||||||
assert.equal(parsed.sections.get("ssh").values.remote_port, 17227);
|
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