简体   繁体   English

从ASPX页面运行命令行,并将输出返回到页面

[英]Running Command line from an ASPX page, and returning output to page

I'm trying to access the command line and execute a command, and then return the output to my aspx page. 我正在尝试访问命令行并执行命令,然后将输出返回到我的aspx页面。 A good example would be running dir on page load of an aspx page and returning the output via Response.Write(). 一个很好的例子是在aspx页面的页面加载上运行dir并通过Response.Write()返回输出。 I have tried using the code below. 我尝试过使用下面的代码。 When I try debugging this it runs but never finishes loading and no output is rendered. 当我尝试调试它时,它会运行,但永远不会完成加载,也不会呈现输出。 I am using C# and .NET Framework 3.5sp1. 我正在使用C#和.NET Framework 3.5sp1。 Any help much appreciated. 任何帮助非常感谢。

Thanks, Bryan 谢谢,布莱恩

public partial class CommandLine : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        System.Diagnostics.Process si = new System.Diagnostics.Process();
        si.StartInfo.WorkingDirectory = @"c:\";
        si.StartInfo.UseShellExecute = false;
        si.StartInfo.FileName = "cmd.exe";
        si.StartInfo.Arguments = "dir";
        si.StartInfo.CreateNoWindow = true;
        si.StartInfo.RedirectStandardInput = true;
        si.StartInfo.RedirectStandardOutput = true;
        si.StartInfo.RedirectStandardError = true;
        si.Start();
        string output = si.StandardOutput.ReadToEnd();
        si.Close();
        Response.Write(output);
    }
}

You have a problem with the syntax of commandline arguments to cmd.exe. cmd.exe的命令行参数的语法有问题。 This is why cmd never exits. 这就是为什么cmd永远不会退出的原因。
In order to have cmd.exe run a program and then quit, you need to send it the syntax "/c [command]". 为了让cmd.exe运行程序然后退出,你需要发送语法“/ c [command]”。 Try running the same code with the line 尝试使用该行运行相同的代码

        si.StartInfo.Arguments = "dir";

replaced with 换成了

        si.StartInfo.Arguments = "/c dir";

and see if it works. 看看它是否有效

Most likely your problem is with the permissions. 最有可能的问题是权限问题。 The user under which ASP.NET process runs is with very limited rights. 运行ASP.NET进程的用户权限非常有限。

So, either you have to set the proper permissions for that user, or run ASP.NET under some other user. 因此,要么必须为该用户设置适当的权限,要么在其他用户下运行ASP.NET。

This hides a security risks though, so you have to be very careful. 这隐藏了安全风险,所以你必须非常小心。

This is madness! 这太疯狂了! Use the System.IO namepace to create your file list from inside your C# program! 使用System.IO名称空间从C#程序中创建文件列表! It's very easy to do; 这很容易做到; although this technique also has authorization issues. 虽然这种技术也有授权问题。

Use System.Diagnostics.Process. 使用System.Diagnostics.Process。

Here is some ASP.NET code shelling out to run subversion commands on the command line. 下面是一些ASP.NET代码,用于在命令行上运行subversion命令。

    ///////////////////////////////////////////////////////////////////////
    public static string run_svn(string args_without_password, string svn_username, string svn_password)
    {
        // run "svn.exe" and capture its output

        System.Diagnostics.Process p = new System.Diagnostics.Process();
        string svn_path = Util.get_setting("SubversionPathToSvn", "svn");
        p.StartInfo.FileName = svn_path;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;

        args_without_password += " --non-interactive";
        Util.write_to_log ("Subversion command:" + svn_path + " " + args_without_password);

        string args_with_password = args_without_password;

        if (svn_username != "")
        {
            args_with_password += " --username ";
            args_with_password += svn_username;
            args_with_password += " --password ";
            args_with_password += svn_password;
        }

        p.StartInfo.Arguments = args_with_password;
        p.Start();
        string stdout = p.StandardOutput.ReadToEnd();
        p.WaitForExit();
        stdout += p.StandardOutput.ReadToEnd();

        string error = p.StandardError.ReadToEnd();

        if (error != "")
        {
            Util.write_to_log(error);
            Util.write_to_log(stdout);
        }

        if (error != "")
        {
            string msg = "ERROR:";
            msg += "<div style='color:red; font-weight: bold; font-size: 10pt;'>";
            msg += "<br>Error executing svn.exe command from web server.";
            msg += "<br>" + error;
            msg += "<br>Arguments passed to svn.exe (except user/password):" + args_without_password;
            if (error.Contains("File not found"))
            {
                msg += "<br><br>***** Has this file been deleted or renamed? See the following links:";
                msg += "<br><a href=http://svn.collab.net/repos/svn/trunk/doc/user/svn-best-practices.html>http://svn.collab.net/repos/svn/trunk/doc/user/svn-best-practices.html</a>";
                msg += "<br><a href=http://subversion.open.collab.net/articles/best-practices.html>http://subversion.open.collab.net/articles/best-practices.html</a>";
                msg += "</div>";
            }
            return msg;
        }
        else
        {
            return stdout;
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM