代码之家  ›  专栏  ›  技术社区  ›  Cristian Diaconescu

C+telnet进程w/重定向的标准流立即退出

  •  1
  • Cristian Diaconescu  · 技术社区  · 15 年前

    我正在尝试用C语言做一个“脚本化的telnet”项目(类似于 Tcl Expect package)我需要为其启动telnet进程并重定向(和处理)其stdin/stdout流。

    问题是,生成的telnet进程在启动后立即退出(但它确实启动了)。
    如果我尝试对-say-cmd.exe执行相同的操作,它会起作用。

    telnet实现是否需要交互式stdin?这个概念在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 回复  |  直到 15 年前
        1
  •  1
  •   T.J. Crowder    15 年前

    你所有的实验 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键。用一个工具做的类似实验 阅读stdin( nslookup --嘿,这是我必须要做的)工作很好。

        2
  •  3
  •   Hans Passant    15 年前

    无法重定向telnet.exe。可能的原因是它像一个终端,模仿VT100。一个提示就是,当你启动它时,它会清除屏幕。只有当程序直接写入控制台屏幕缓冲区时,这才是可能的。没有已知的方法使其正常工作,否则,set term命令没有非终端模式选项。