我正在尝试用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", "");
...
输出
退出?假
答案 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
- 嘿,这是我必须提供的)工作正常。