views:

332

answers:

2

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 dscribed 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

+1  A: 

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.

T.J. Crowder
+1  A: 

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.

Hans Passant