带有重定向标准流的C#+ telnet进程立即退出

时间:2010-02-06 10:10:54

标签: c# redirect process

我正在尝试用C#(类似于Tcl Expect包的东西)做一个'脚本telnet'项目,我需要启动一个telnet进程并重定向(和处理)它的stdin / stdout流。

问题是,生成的telnet进程在启动后立即退出(但它确实启动) 如果我尝试使用-say- cmd.exe执行相同操作,则可以正常工作。

telnet实现是否需要交互式标准输入?这个概念甚至存在于Windows中吗?

我正在运行Win7 64位,这是否会导致dscribed行为?

这是我使用的代码段:

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 个答案:

答案 0 :(得分:3)

无法重定向Telnet.exe。可能的原因是它像终端一样,模仿VT100。当你启动它时会看到一个提示,它会清除屏幕。只有当程序直接写入控制台屏幕缓冲区时才有可能。没有已知的方法使其行为不然,set term命令没有非终端模式选项。

答案 1 :(得分:1)

您使用cmd.exe进行的实验证明,您已成功启动cmd.exe。 : - )

您是否尝试在命令提示符窗口中执行C:\Windows\system32\telnet.exe towel.blinkenlights.nl以确保其有效?完成后,您是否尝试过从文件中重定向输入(例如C:\Windows\system32\telnet.exe towel.blinkenlights.nl < filename)?

我怀疑Windows的telnet可能没有使用stdin作为其输入,以便处理终端仿真。

我只是尝试了一个非常简单且可能天真的实验,表明情况就是这样,至少在XP 32位中。我这样做了:

echo GET / | telnet www.google.com 80

...它不起作用,而telnet www.google.com 80然后输入GET /并按Enter键。一个类似的实验,使用 读取标准输入的工具(nslookup - 嘿,这是我必须提供的)工作正常。