Отправка команд на стандартный ввод и отправка конца передачи (Ctrl+D)
Я хочу запустить следующий код.
Приложение, которое я вызываю, ожидает такие команды, как User-Name=albert следующая строка, другая команда и так далее, пока вы не закончите.
Если вам нужно было ввести это вручную из командной строки, вы бы набрали команду, нажмите Enter, введите команду нажмите Enter. Прямо в конце ПОСЛЕ НАЖМЕНИЯ ВВОД после последней команды вы должны нажать 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 ответа
Вам нужно написать приложение "\x04"
с обратным ударом (\
)
Для получения дополнительной информации см. Документацию (секция String Escape Sequence)
sb.Append("/x4");
это не контроль-D
Возможно, вы имели в виду
sb.Append("\x04");