Compare commits
10 Commits
33a795c813
...
23995df656
Author | SHA1 | Date | |
---|---|---|---|
23995df656
|
|||
bde7c4fe6f
|
|||
7924aea2c3
|
|||
ae52121509
|
|||
d990b6aaca
|
|||
5ac2571680
|
|||
68812721a1
|
|||
6409416961
|
|||
b8d17ddb96
|
|||
1a8469c264
|
@@ -13,7 +13,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Spectre.Console" Version="0.49.2-preview.0.71" />
|
<PackageReference Include="Spectre.Console" Version="0.49.2-preview.0.71"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@@ -1,9 +1,226 @@
|
|||||||
namespace PortProxyTool.Cli;
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace PortProxyTool.Cli;
|
||||||
|
|
||||||
internal static class Program
|
internal static class Program
|
||||||
{
|
{
|
||||||
private static void Main(string[] args)
|
private static void Main(string[] args)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Hello, World!");
|
if (args.Length == 0)
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
$"[red]用法[/][gray]: [/][white]{Environment.ProcessPath ?? Environment.GetCommandLineArgs()[0]} [red]<命令>[/] [gray][[<参数>]][/][/]");
|
||||||
|
else
|
||||||
|
switch (args[0])
|
||||||
|
{
|
||||||
|
case "add":
|
||||||
|
switch (args.Length)
|
||||||
|
{
|
||||||
|
case 6:
|
||||||
|
var targetType = PortProxyUtil.GetPortProxyTypeByString(args[1]);
|
||||||
|
if (targetType == null)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的第一个参数为 v4tov4, v4tov6, v6tov6, v6tov4[/]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ushort.TryParse(args[3], out var listenPort))
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的第三个参数为 0 - 65535[/]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ushort.TryParse(args[5], out var targetPort))
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的第五个参数为 0 - 65535[/]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var item = new PortProxyItem
|
||||||
|
{
|
||||||
|
Type = (PortProxyType)targetType,
|
||||||
|
ListenAddress = args[2],
|
||||||
|
ListenPort = listenPort,
|
||||||
|
TargetAddress = args[4],
|
||||||
|
TargetPort = targetPort
|
||||||
|
};
|
||||||
|
var result = PortProxy.Add(item);
|
||||||
|
AnsiConsole.MarkupLine(string.IsNullOrEmpty(result)
|
||||||
|
? "[green]添加成功[/]"
|
||||||
|
: $"[red]添加失败[/][gray]:[/] [white]{result}[/]");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的参数为 <v4tov4/v4tov6/v6tov6/v6tov4> <监听地址> <监听端口> <目标地址> <目标端口>[/]");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
case "remove":
|
||||||
|
switch (args.Length)
|
||||||
|
{
|
||||||
|
case 4:
|
||||||
|
var targetType = PortProxyUtil.GetPortProxyTypeByString(args[1]);
|
||||||
|
var result = PortProxy.Remove(targetType, args[2], args[3]);
|
||||||
|
AnsiConsole.MarkupLine(string.IsNullOrEmpty(result)
|
||||||
|
? "[green]删除成功[/]"
|
||||||
|
: $"[red]删除失败[/][gray]:[/] [white]{result}[/]");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的参数为 <v4tov4/v4tov6/v6tov6/v6tov4> <监听地址> <监听端口>[/]");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
case "set":
|
||||||
|
switch (args.Length)
|
||||||
|
{
|
||||||
|
case 6:
|
||||||
|
var targetType = PortProxyUtil.GetPortProxyTypeByString(args[1]);
|
||||||
|
if (targetType == null)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的第一个参数为 v4tov4, v4tov6, v6tov6, v6tov4[/]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ushort.TryParse(args[3], out var listenPort))
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的第三个参数为 0 - 65535[/]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ushort.TryParse(args[5], out var targetPort))
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的第五个参数为 0 - 65535[/]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var item = new PortProxyItem
|
||||||
|
{
|
||||||
|
Type = (PortProxyType)targetType,
|
||||||
|
ListenAddress = args[2],
|
||||||
|
ListenPort = listenPort,
|
||||||
|
TargetAddress = args[4],
|
||||||
|
TargetPort = targetPort
|
||||||
|
};
|
||||||
|
var result = PortProxy.Set(item);
|
||||||
|
AnsiConsole.MarkupLine(string.IsNullOrEmpty(result)
|
||||||
|
? "[green]设置成功[/]"
|
||||||
|
: $"[red]设置失败[/][gray]:[/] [white]{result}[/]");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的参数为 <v4tov4/v4tov6/v6tov6/v6tov4> <监听地址> <监听端口> <目标地址> <目标端口>[/]");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
case "list":
|
||||||
|
switch (args.Length)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
var portProxies = PortProxy.GetPortProxies();
|
||||||
|
if (portProxies.Length == 0)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine("[red]无端口代理[/]");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine("[white]端口代理列表[/][gray]: [/]");
|
||||||
|
for (var index = 0; index < portProxies.Length; index++)
|
||||||
|
{
|
||||||
|
var portProxy = portProxies[index];
|
||||||
|
var type = portProxy.Type switch
|
||||||
|
{
|
||||||
|
PortProxyType.V4ToV4 => "[green]IPv4[/] [white]->[/] [green]IPv4[/]",
|
||||||
|
PortProxyType.V4ToV6 => "[green]IPv4[/] [white]->[/] [blue]IPv6[/]",
|
||||||
|
PortProxyType.V6ToV6 => "[blue]IPv6[/] [white]->[/] [blue]IPv6[/]",
|
||||||
|
PortProxyType.V6ToV4 => "[blue]IPv6[/] [white]->[/] [green]IPv4[/]",
|
||||||
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
|
};
|
||||||
|
var targetPort = portProxy.TargetPort switch
|
||||||
|
{
|
||||||
|
null => "[red]未知[/]",
|
||||||
|
_ => portProxy.TargetPort.ToString()
|
||||||
|
};
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
$"[gray]{index + 1}.[/] {type} [gray]|[/] [white]{portProxy.ListenAddress}[/][gray]:[/][white]{portProxy.ListenPort}[/][gray] -> [/][white]{portProxy.TargetAddress ?? "[red]未知[/]"}[/][gray]:[/][white]{targetPort}[/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
PortProxyType type;
|
||||||
|
switch (args[1])
|
||||||
|
{
|
||||||
|
case "v4tov4":
|
||||||
|
type = PortProxyType.V4ToV4;
|
||||||
|
break;
|
||||||
|
case "v4tov6":
|
||||||
|
type = PortProxyType.V4ToV6;
|
||||||
|
break;
|
||||||
|
case "v6tov6":
|
||||||
|
type = PortProxyType.V6ToV6;
|
||||||
|
break;
|
||||||
|
case "v6tov4":
|
||||||
|
type = PortProxyType.V6ToV4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]参数错误[/][gray]:[/] [white]接受的参数为 v4tov4, v4tov6, v6tov6, v6tov4[/]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var portProxies = PortProxy.GetPortProxies().Where(x => x.Type == type).ToArray();
|
||||||
|
if (portProxies.Length == 0)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine("[red]无端口代理[/]");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var typeStr = type switch
|
||||||
|
{
|
||||||
|
PortProxyType.V4ToV4 => "[green]IPv4[/] [white]->[/] [green]IPv4[/]",
|
||||||
|
PortProxyType.V4ToV6 => "[green]IPv4[/] [white]->[/] [blue]IPv6[/]",
|
||||||
|
PortProxyType.V6ToV6 => "[blue]IPv6[/] [white]->[/] [blue]IPv6[/]",
|
||||||
|
PortProxyType.V6ToV4 => "[blue]IPv6[/] [white]->[/] [green]IPv4[/]",
|
||||||
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
|
};
|
||||||
|
AnsiConsole.MarkupLine($"[white]{typeStr} 端口代理列表[/][gray]: [/]");
|
||||||
|
for (var index = 0; index < portProxies.Length; index++)
|
||||||
|
{
|
||||||
|
var portProxy = portProxies[index];
|
||||||
|
var targetPort = portProxy.TargetPort switch
|
||||||
|
{
|
||||||
|
null => "[red]未知[/]",
|
||||||
|
_ => portProxy.TargetPort.ToString()
|
||||||
|
};
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
$"[gray]{index + 1}.[/] {typeStr} [gray]|[/] [white]{portProxy.ListenAddress}[/][gray]:[/][white]{portProxy.ListenPort}[/][gray] -> [/][white]{portProxy.TargetAddress ?? "[red]未知[/]"}[/][gray]:[/][white]{targetPort}[/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"[red]用法错误[/][gray]:[/] [white]get [gray][[v4tov4/v4tov6/v6tov6/v6tov4]][/][/]");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
AnsiConsole.MarkupLine("[red]命令没有找到[/][gray]:[/] [white]接受的命令为 add, remove, set, list[/]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -78,7 +78,7 @@ public static class PortProxy
|
|||||||
{
|
{
|
||||||
var output =
|
var output =
|
||||||
ExecuteCommand(
|
ExecuteCommand(
|
||||||
$"delete {type.ToString().ToLower()} listenaddress=\"{listenAddress}\" listenport=\"{listenPort}\" connectAddress=\"{connectAddress}\" connectPort=\"{connectPort}\" protocol=\"{protocol}\"");
|
$"add {type.ToString().ToLower()} listenaddress=\"{listenAddress}\" listenport=\"{listenPort}\" connectAddress=\"{connectAddress}\" connectPort=\"{connectPort}\" protocol=\"{protocol}\"");
|
||||||
return output.Length > 0 ? output[0] : string.Empty;
|
return output.Length > 0 ? output[0] : string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
PortProxyTool/PortProxyUtil.cs
Normal file
16
PortProxyTool/PortProxyUtil.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
namespace PortProxyTool;
|
||||||
|
|
||||||
|
public static class PortProxyUtil
|
||||||
|
{
|
||||||
|
public static PortProxyType? GetPortProxyTypeByString(string type)
|
||||||
|
{
|
||||||
|
return type.ToLower() switch
|
||||||
|
{
|
||||||
|
"v4tov4" => PortProxyType.V4ToV4,
|
||||||
|
"v4tov6" => PortProxyType.V4ToV6,
|
||||||
|
"v6tov6" => PortProxyType.V6ToV6,
|
||||||
|
"v6tov4" => PortProxyType.V6ToV4,
|
||||||
|
_ => null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user