diff --git a/NetBash/CommandResult.cs b/NetBash/CommandResult.cs
index 0d6028c..47fbdd7 100644
--- a/NetBash/CommandResult.cs
+++ b/NetBash/CommandResult.cs
@@ -9,5 +9,6 @@ internal class CommandResult
{
public string Result { get; set; }
public bool IsHtml { get; set; }
+ public string FileName { get; set; }
}
}
diff --git a/NetBash/NetBash.cs b/NetBash/NetBash.cs
index 0e7789e..50f4cc0 100644
--- a/NetBash/NetBash.cs
+++ b/NetBash/NetBash.cs
@@ -73,7 +73,14 @@ internal CommandResult Process(string commandText)
var webCommand = (IWebCommand)Activator.CreateInstance(commandType);
var result = new CommandResult() { IsHtml = webCommand.ReturnHtml };
- result.Result = webCommand.Process(split.Skip(1).ToArray());
+ // Check for file redirect
+ var args = split.Skip(1).ToArray();
+ if (args.Length >= 2 && args[args.Length - 2] == ">")
+ {
+ result.FileName = args[args.Length - 1];
+ Array.Resize(ref args, args.Length - 2);
+ }
+ result.Result = webCommand.Process(args);
return result;
}
diff --git a/NetBash/UI/NetBashHandler.cs b/NetBash/UI/NetBashHandler.cs
index 9acbc13..df6ee8b 100644
--- a/NetBash/UI/NetBashHandler.cs
+++ b/NetBash/UI/NetBashHandler.cs
@@ -42,6 +42,7 @@ internal static void RegisterRoutes()
var urls = new[]
{
"netbash",
+ "netbash-export",
"netbash-jquery-js",
"netbash-keymaster-js",
"netbash-style-css",
@@ -108,6 +109,10 @@ public void ProcessRequest(HttpContext context)
output = RenderCommand(context);
break;
+ case "netbash-export":
+ output = ExportCommand(context);
+ break;
+
default:
output = NotFound(context);
break;
@@ -157,6 +162,26 @@ private static string RenderCommand(HttpContext context)
return sb.ToString();
}
+ private static string ExportCommand(HttpContext context)
+ {
+ if (NetBash.Settings.Authorize != null && !NetBash.Settings.Authorize(HttpContext.Current.Request))
+ throw new UnauthorizedAccessException();
+
+ try
+ {
+ var result = NetBash.Current.Process(context.Request.Params["Command"]);
+ context.Response.ContentType = "application/octet-stream";
+ context.Response.AddHeader(
+ "Content-Disposition",
+ "attachment; filename=" + (string.IsNullOrEmpty(result.FileName) ? "result.txt" : result.FileName));
+ return result.Result;
+ }
+ catch (Exception ex)
+ {
+ return ex.Message;
+ }
+ }
+
///