C# + telnet process w/ redirected standard streams quits immediately
I'm trying to do a 'scripted telnet' project in C# (something vaguely resembling the Tcl Expect package) for which I need to start a telnet process and redirect (and process) its stdin/stdout streams.
The problem is, the spawned telnet process quits immediately after starting (it does start, however).
If I try to do the same with -say- cmd.exe, it works.Does the telnet implementation require an interactive stdin? Does this concept even exist in Windows?
I'm running Win7 64 bit, could this contribute to the dsc开发者_如何学运维ribed behaviour?
Here's the snippet i use:
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);
The output is:
exited? True
If I use this:
...
m_process.StartInfo = new ProcessStartInfo(
@"C:\Windows\system32\cmd.exe", "");
...
the output is
exited? False
Telnet.exe cannot be redirected. The probable reason is that it acts like a terminal, emulating a VT100. One hint of that you see when you start it, it clears the screen. That's only possible if a program directly writes to the console screen buffer. There is no known way to make it behave otherwise, the set term command doesn't have a non-terminal mode option.
All that your experiments with cmd.exe
prove is that you're successfully launching cmd.exe
. :-)
Have you tried doing C:\Windows\system32\telnet.exe towel.blinkenlights.nl
in a command prompt window to make sure that works? Having done that, have you tried redirecting input to it from a file (e.g., C:\Windows\system32\telnet.exe towel.blinkenlights.nl < filename
)?
I suspect that Windows' telnet may not be using stdin for its input, in order to handle terminal emulation.
I just tried a very simple and possibly naive experiment suggesting that that's the case, at least in XP 32-bit. I did this:
echo GET / | telnet www.google.com 80
...and it didn't work, whereas telnet www.google.com 80
and then typing GET /
and pressing enter does. A similar experiment with a tool that does read stdin (nslookup
-- hey, it was what I had to hand) worked fine.
精彩评论