C # + процесс telnet с перенаправленными стандартными потоками немедленно завершается - PullRequest
1 голос
/ 06 февраля 2010

Я пытаюсь сделать проект "telnet" в C # (что-то смутно напоминающее пакет Tcl Expect ), для которого мне нужно запустить процесс telnet и перенаправить (и обработать) его stdin / стандартный поток

Проблема в том, что порожденный процесс telnet завершается сразу после запуска (однако он запускается).
Если я попытаюсь сделать то же самое с -say- cmd.exe, это сработает.

Требуется ли для реализации telnet интерактивный стандартный ввод? Эта концепция вообще существует в Windows?

Я использую 64-разрядную версию Win7, может ли это повлиять на описанное поведение?

Вот фрагмент, который я использую:

Process m_process = new Process();
m_process.StartInfo = new ProcessStartInfo(
                 @"C:\Windows\system32\telnet.exe", "towel.blinkenlights.nl");

//required to redirect stdXXX
m_process.StartInfo.UseShellExecute = false;
m_process.StartInfo.ErrorDialog = false;

m_process.StartInfo.RedirectStandardInput = true;
m_process.StartInfo.RedirectStandardOutput = true;
m_process.StartInfo.RedirectStandardError = true;

Thread.Sleep(50);
Console.WriteLine(" exited? " + m_process.HasExited);

Вывод:

вышла? Правда

Если я использую это:

...
m_process.StartInfo = new ProcessStartInfo(
                @"C:\Windows\system32\cmd.exe", "");
...

вывод

вышла? Ложные

Ответы [ 2 ]

3 голосов
/ 06 февраля 2010

Telnet.exe не может быть перенаправлен. Вероятная причина в том, что он действует как терминал, эмулирующий VT100. Один намек на то, что вы видите, когда запускаете его, он очищает экран. Это возможно только в том случае, если программа непосредственно записывает данные в буфер экрана консоли. Нет никакого известного способа заставить его вести себя иначе, команда set term не имеет опции нетерминального режима.

1 голос
/ 06 февраля 2010

Все, что ваши эксперименты с cmd.exe доказывают, это то, что вы успешно запускаете cmd.exe. : -)

Вы пытались сделать C:\Windows\system32\telnet.exe towel.blinkenlights.nl в окне командной строки, чтобы убедиться, что это работает? Сделав это, вы пытались перенаправить ввод данных из файла (например, C:\Windows\system32\telnet.exe towel.blinkenlights.nl < filename)?

Я подозреваю, что telnet Windows, возможно, не использует stdin для своего ввода для обработки эмуляции терминала.

Я только что попробовал очень простой и, возможно, наивный эксперимент, предполагая, что это так, по крайней мере, в 32-битной XP. Я сделал это:

echo GET / | telnet www.google.com 80

... и это не сработало, тогда как telnet www.google.com 80, а затем набрав GET / и нажав Enter, делает. Подобный эксперимент с инструментом, который читает читает stdin (nslookup - эй, это было то, что я должен был вручить), работал отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...