Подтвердить что ты не робот

Запуск командной строки с страницы ASPX и возврат вывода на страницу

Я пытаюсь получить доступ к командной строке и выполнить команду, а затем вернуть вывод на мою страницу aspx. Хорошим примером будет запуск dir при загрузке страницы aspx-страницы и возврат результата через Response.Write(). Я попытался использовать приведенный ниже код. Когда я пытаюсь отлаживать это, он запускается, но не завершает загрузку и не выводится вывод. Я использую С# и .NET Framework 3.5sp1. Любая помощь очень ценится.

Спасибо, 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);
    }
}
4b9b3361

Ответ 1

У вас возникла проблема с синтаксисом аргументов командной строки для cmd.exe. Вот почему cmd никогда не выйдет.
Чтобы программа cmd.exe запускала программу и затем выходила, вам необходимо отправить ей синтаксис "/c [command]". Попробуйте запустить тот же код с линией

        si.StartInfo.Arguments = "dir";

заменен на

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

и посмотрите, работает ли он.

Ответ 2

Скорее всего, ваша проблема связана с разрешениями. Пользователь, под которым выполняется процесс ASP.NET, имеет очень ограниченные права.

Итак, либо вы должны установить правильные разрешения для этого пользователя, либо запустить ASP.NET под другим пользователем.

Это скрывает риски безопасности, поэтому вы должны быть очень осторожны.

Ответ 3

Это безумие! Используйте пространство имен System.IO для создания списка файлов внутри вашей программы на С#! Это очень легко сделать; хотя этот метод также имеет проблемы с авторизацией.

Ответ 4

Использовать System.Diagnostics.Process.

Ниже приведен пример оболочки кода 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;
        }
    }