Отправка команд на стандартный ввод и отправка конца передачи (Ctrl + D) - PullRequest
2 голосов
/ 03 марта 2010

Я хочу запустить следующий код.

Приложение, которое я вызываю, ожидает команды типа User-Name = albert на следующей строке, другой команды и т. Д., Пока вы не закончите.

Если вам нужно было ввести это вручную из командной строки, вы бы набрали команду, нажмите ввод, введите команду нажмите ввод.В самом конце ПОСЛЕ НАЖИМА ВВОДА после последней команды вы должны нажать Ctrl + D, чтобы завершить ее, запустить программу и вернуться с сообщением о том, что произошло.

Если вы введете команду неправильно, приложение скажет "ожидание = "означает, что вы отправили строку, которая не отформатирована правильно ...

Итак, что я делаю ниже, это симуляция ввода этой строки вручную, одна команда, новая строка, одна команда, новая строка и т. д.,до конца, тогда я просто добавляю Ctrl + D после последней команды.Это не работает, и программа говорит "ожидание ="

Есть ли очевидные проблемы?

Спасибо за ваше время.Альберт

        // CREATE DISCONNECT FILE
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("User-Name=" + this.userName);
        sb.AppendLine("Acct-Session-Id=" + this.sessionID);
        sb.AppendLine("NAS-IP-Address=" + Setting.Item["EDGE.NASIP"]);
        sb.AppendLine("Framed-IP-Address=" + this.currentIP);
        sb.Append("/x4");
        System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo();
        procStartInfo.WorkingDirectory = radclientPath.Substring(0, radclientPath.LastIndexOf("\\"));
        procStartInfo.FileName = radclientPath;
        procStartInfo.Arguments = @"-r 1 -d ..\etc\raddb -x 192.168.1.240:3799 disconnect password";
        procStartInfo.RedirectStandardInput = true;
        procStartInfo.RedirectStandardError = true;
        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;

        System.Diagnostics.Process proc = System.Diagnostics.Process.Start(procStartInfo);

        proc.StandardInput.Write(sb.ToString());
        proc.WaitForExit(5000);

        if (proc.HasExited)
        {
            System.IO.File.WriteAllText(@"D:\temp.txt", proc.StandardOutput.ReadToEnd());
            System.IO.File.WriteAllText(@"D:\temp2.txt", proc.StandardError.ReadToEnd());
            string message = proc.StandardOutput.ReadToEnd() + "\n---\nErrors:\n---\n" + proc.StandardError.ReadToEnd();
            return message;
        }
        System.IO.File.WriteAllText(@"D:\temp.txt", proc.StandardOutput.ReadToEnd());
        System.IO.File.WriteAllText(@"D:\temp2.txt", proc.StandardError.ReadToEnd());
        return "";
    }

Я также попробовал сделать это в одинарных кавычках и с нулем, начинающимся с числа (\ x04) и ничего, поэтому я попытался записать то, что должно быть отправлено в программу, в текстовый файл.Затем я запустил программу, используя те же параметры командной строки, что и ниже.Скопировал то, что было во всем текстовом файле, и вставил его в командную строку, и это прекрасно работает.Не уверен, почему он не отправляется на стандартный ввод.

        StringBuilder sb = new StringBuilder();
        sb.AppendLine("User-Name=" + this.userName);
        sb.Append('\x04');
        System.IO.File.WriteAllText(@"D:\input.txt", sb.ToString());
        System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo();
        procStartInfo.WorkingDirectory = radclientPath.Substring(0, radclientPath.LastIndexOf("\\"));
        procStartInfo.FileName = radclientPath;
        procStartInfo.Arguments = @"-r 1 -d ..\etc\raddb -x 192.168.1.240:3799 disconnect password";
        procStartInfo.RedirectStandardInput = true;
        procStartInfo.RedirectStandardError = true;
        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;
        System.Diagnostics.Process proc = System.Diagnostics.Process.Start(procStartInfo);
        proc.StandardInput.Write(sb.ToString());
        proc.WaitForExit(5000);

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Вам нужно написать приложение "\x04", с обратным слэшем (\)

Для получения дополнительной информации см. Документацию (секция Escape-последовательности строк)

0 голосов
/ 03 марта 2010
sb.Append("/x4");

это не контроль-D

Возможно, вы имели в виду

sb.Append("\x04");
...