2023-08-31 19:20:41 +08:00
|
|
|
|
using System.Diagnostics;
|
2023-02-15 01:00:50 +08:00
|
|
|
|
using System.Net.Sockets;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace RCmdS
|
|
|
|
|
{
|
|
|
|
|
internal class Program
|
|
|
|
|
{
|
|
|
|
|
private static Socket severSocket = null;
|
|
|
|
|
|
|
|
|
|
private static Process p;
|
|
|
|
|
|
|
|
|
|
private static Queue<string> cmdResultQueue = new Queue<string>();
|
|
|
|
|
|
|
|
|
|
private static Socket clientSocket;
|
|
|
|
|
|
|
|
|
|
private static void Main(string[] args)
|
|
|
|
|
{
|
2023-08-31 19:20:41 +08:00
|
|
|
|
//装载启动参数
|
|
|
|
|
string[] CmdLineArgs = Environment.GetCommandLineArgs();
|
|
|
|
|
int port = 10492;
|
|
|
|
|
if (CmdLineArgs.Count() >= 2 && int.TryParse(CmdLineArgs[1].Trim('/').Trim(), out int result))
|
|
|
|
|
{
|
|
|
|
|
port = result;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("参数错误,使用默认端口。需要指定端口命令 >RCmdS <端口> ");
|
|
|
|
|
|
|
|
|
|
}
|
2023-02-15 01:00:50 +08:00
|
|
|
|
|
|
|
|
|
p = new Process();
|
|
|
|
|
p.StartInfo.FileName = "cmd.exe"; //待执行的文件路径
|
|
|
|
|
p.StartInfo.UseShellExecute = false; //重定向输出,这个必须为false
|
|
|
|
|
p.StartInfo.RedirectStandardError = true; //重定向错误流
|
|
|
|
|
p.StartInfo.RedirectStandardInput = true; //重定向输入流
|
|
|
|
|
p.StartInfo.RedirectStandardOutput = true; //重定向输出流
|
|
|
|
|
p.StartInfo.CreateNoWindow = false; //不启动cmd黑框框
|
|
|
|
|
p.Start();
|
|
|
|
|
|
|
|
|
|
severSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
2023-08-31 19:20:41 +08:00
|
|
|
|
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
|
2023-02-15 01:00:50 +08:00
|
|
|
|
severSocket.Bind(endPoint); // 绑定
|
|
|
|
|
severSocket.Listen(1); // 设置最大连接数
|
2023-08-31 19:20:41 +08:00
|
|
|
|
Console.WriteLine($"开始监听 {port}");
|
2023-02-15 01:00:50 +08:00
|
|
|
|
Thread thread = new Thread(ListenClientConnect); // 开启线程监听客户端连接
|
|
|
|
|
thread.Start("连接成功");
|
|
|
|
|
|
|
|
|
|
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
|
|
|
|
|
{
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
if (p != null && !p.HasExited)
|
|
|
|
|
{
|
|
|
|
|
StreamReader sr = p.StandardOutput;
|
|
|
|
|
string str = sr.ReadLine();
|
|
|
|
|
Console.WriteLine(str);
|
|
|
|
|
cmdResultQueue.Enqueue(str);
|
|
|
|
|
}
|
|
|
|
|
Thread.Sleep(10);
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
|
|
|
|
|
{
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
if (p != null && !p.HasExited)
|
|
|
|
|
{
|
|
|
|
|
StreamReader sr = p.StandardError;
|
|
|
|
|
string str = sr.ReadLine();
|
|
|
|
|
Console.WriteLine(str);
|
|
|
|
|
cmdResultQueue.Enqueue(str);
|
|
|
|
|
}
|
|
|
|
|
//Thread.Sleep(10);
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
|
|
|
|
|
{
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
if (clientSocket != null)
|
|
|
|
|
{
|
|
|
|
|
while (cmdResultQueue.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
clientSocket.Send(Encoding.Default.GetBytes(cmdResultQueue.Dequeue()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//Thread.Sleep(10);
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
string cmd = Console.ReadLine();
|
|
|
|
|
p.StandardInput.WriteLine(cmd);
|
|
|
|
|
Console.WriteLine("输出命令");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 监听客户端连接
|
|
|
|
|
/// </summary>
|
|
|
|
|
private static void ListenClientConnect(object msg)
|
|
|
|
|
{
|
|
|
|
|
clientSocket = severSocket.Accept(); // 接收客户端连接
|
|
|
|
|
Console.WriteLine("客户端连接成功 信息: " + clientSocket.AddressFamily.ToString());
|
|
|
|
|
clientSocket.Send(Encoding.Default.GetBytes(msg.ToString()));
|
|
|
|
|
Thread revThread = new Thread(ReceiveClientManage);
|
|
|
|
|
revThread.Start(clientSocket);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void ReceiveClientManage(object clientSocket)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Socket socket = clientSocket as Socket;
|
|
|
|
|
byte[] buffer = new byte[1024];
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
Array.Clear(buffer, 0, buffer.Length);
|
|
|
|
|
socket.Receive(buffer); // 从客户端接收消息
|
|
|
|
|
string cmd = Encoding.Default.GetString(buffer);
|
|
|
|
|
Console.WriteLine("收到消息:" + cmd);
|
|
|
|
|
cmd = cmd.Replace("\0", "");
|
|
|
|
|
Exec(cmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (SocketException)
|
|
|
|
|
{
|
|
|
|
|
//客户端断开重启
|
|
|
|
|
severSocket.Close();
|
|
|
|
|
severSocket.Dispose();
|
|
|
|
|
GC.Collect();
|
|
|
|
|
Process.Start(Process.GetCurrentProcess().MainModule.FileName);
|
|
|
|
|
Environment.Exit(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 执行客户端发来的cmd命令
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="cmd"></param>
|
|
|
|
|
private static void Exec(string cmd)
|
|
|
|
|
{
|
|
|
|
|
p.StandardInput.WriteLine(cmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-08-31 19:20:41 +08:00
|
|
|
|
}
|