等待 Azure Function Apps 中的 .exe 输出
Waiting for .exe output in Azure Function Apps
我正在尝试从 Azure Function App 中的 .exe 应用程序接收输出。 Function 应用程序由 HTTP 请求触发。
函数应用程序触发并 运行s 可执行文件。然后我想等待 .exe 到 运行 和 return 如果可能的话,输出作为 HTTP 响应中的 Json 字符串。这是我的代码:
namespace FunctionApp
{
public static class NmapFunction
{
[FunctionName("NmapFunction")]
public static async Task<HttpResponseMessage> Run(
// wait for HTTP trigger on et or post method. Route is defualt.
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string output = string.Empty;
//Start the nmap .exe
var Process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "Nmap.exe",
Arguments = "-sS -Pn 127.0.0.1",
UseShellExecute = true,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
Process.Start();
while (!Process.StandardOutput.EndOfStream)
{
string line = Process.StandardOutput.ReadLine();
//add each line to the output string
output += line;
}
Process.WaitForExit();
string toolOutput = Newtonsoft.Json.JsonConvert.SerializeObject(new ToolRunResult { Result = output }).ToString();
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(ToolOutput, Encoding.UTF8, "application/json")
};
}
我在 运行 HTTP 请求时收到 500 内部服务器错误。这是因为 while
循环中的 System.InvalidOperationException' in System.Diagnostics.Process.dll
错误。我相信这是因为这是一个同步操作,据我所知,Azure 函数应用程序必须是异步的。
所以,我的问题是 从该 .exe 进程获取输出的最佳方法是什么?有可能吗?
ToolRunResult
class:
internal class ToolRunResult
{
internal int StatusCode { get; set; }
internal string Result { get; set; }
}
What is the best way to get the output from this .exe process? Is it even possible?
是的,在 Azure 函数中是可能的。
请按照 Azure Function
中 运行 nMap.exe 的解决方法
这里我使用计时器触发器 运行 .exe 文件并捕获 .exe[=28= 的输出响应].
public void Run([TimerTrigger("0 */3 * * * *")]TimerInfo myTimer, ILogger log)
{
var p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
string eOut = null;
p.StartInfo.RedirectStandardError = true;
p.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
{ eOut += e.Data; });
p.StartInfo.FileName = "C:\Program Files (x86)\Nmap\nmap.exe";
p.StartInfo.Arguments = "-sS -Pn 127.0.0.1";
p.Start();
// To avoid deadlocks, use an asynchronous read operation on at least one of the streams.
p.BeginErrorReadLine();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
log.LogInformation($"The nMap Exe Result are:\n'{output}'");
log.LogInformation($"\nError stream: {eOut}");
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
结果
错误在 StartInfo
变量中。 UseShellExecute
必须设置为 false
。
不确定这背后的原因,但它成功了。
我正在尝试从 Azure Function App 中的 .exe 应用程序接收输出。 Function 应用程序由 HTTP 请求触发。
函数应用程序触发并 运行s 可执行文件。然后我想等待 .exe 到 运行 和 return 如果可能的话,输出作为 HTTP 响应中的 Json 字符串。这是我的代码:
namespace FunctionApp
{
public static class NmapFunction
{
[FunctionName("NmapFunction")]
public static async Task<HttpResponseMessage> Run(
// wait for HTTP trigger on et or post method. Route is defualt.
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string output = string.Empty;
//Start the nmap .exe
var Process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "Nmap.exe",
Arguments = "-sS -Pn 127.0.0.1",
UseShellExecute = true,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
Process.Start();
while (!Process.StandardOutput.EndOfStream)
{
string line = Process.StandardOutput.ReadLine();
//add each line to the output string
output += line;
}
Process.WaitForExit();
string toolOutput = Newtonsoft.Json.JsonConvert.SerializeObject(new ToolRunResult { Result = output }).ToString();
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(ToolOutput, Encoding.UTF8, "application/json")
};
}
我在 运行 HTTP 请求时收到 500 内部服务器错误。这是因为 while
循环中的 System.InvalidOperationException' in System.Diagnostics.Process.dll
错误。我相信这是因为这是一个同步操作,据我所知,Azure 函数应用程序必须是异步的。
所以,我的问题是 从该 .exe 进程获取输出的最佳方法是什么?有可能吗?
ToolRunResult
class:
internal class ToolRunResult
{
internal int StatusCode { get; set; }
internal string Result { get; set; }
}
What is the best way to get the output from this .exe process? Is it even possible?
是的,在 Azure 函数中是可能的。
请按照 Azure Function
中 运行 nMap.exe 的解决方法这里我使用计时器触发器 运行 .exe 文件并捕获 .exe[=28= 的输出响应].
public void Run([TimerTrigger("0 */3 * * * *")]TimerInfo myTimer, ILogger log)
{
var p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
string eOut = null;
p.StartInfo.RedirectStandardError = true;
p.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
{ eOut += e.Data; });
p.StartInfo.FileName = "C:\Program Files (x86)\Nmap\nmap.exe";
p.StartInfo.Arguments = "-sS -Pn 127.0.0.1";
p.Start();
// To avoid deadlocks, use an asynchronous read operation on at least one of the streams.
p.BeginErrorReadLine();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
log.LogInformation($"The nMap Exe Result are:\n'{output}'");
log.LogInformation($"\nError stream: {eOut}");
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
结果
错误在 StartInfo
变量中。 UseShellExecute
必须设置为 false
。
不确定这背后的原因,但它成功了。