【问题标题】:Telnet server response only echoes in C# applicationTelnet 服务器响应仅在 C# 应用程序中回显
【发布时间】:2020-10-05 00:44:21
【问题描述】:

我需要开发一个应用程序,它能够在使用 Telnet 连接到一个 ip 后发出一些命令,然后只记录正在进行的响应;

所以我尝试了 PrimS.Telnet 和 Minimalistic.Telnet 之类的包;问题是它适用于其他 telnet 服务器,但不适用于这个服务器;我得到的只是大写的回声:

当我使用 Putty(我无法自动化)时,它确实给出了正确的响应:

在消除那个奇怪的故障字符之前,我必须先按一个输入键

这正常吗?我在这里遗漏了什么,为什么我不能在这个服务器上使用我的 C# 应用程序?

编辑 1: 我已经发现我的 C# 不支持某些要求不回显文本的 telnet 命令(请参阅Telnet Commands)。所以我的问题是如何解析这些 telnet 命令以便发送它们?

【问题讨论】:

  • 很难说,因为你没有分享你的代码,但我猜你没有发送正确的 telnet 命令序列。 IAC 做回声。 tools.ietf.org/html/rfc857
  • 我创建了一个类来与 SMTP 服务器通信。我也发送命令并得到答案。它使用NetworkStreamStreamReader(stream) + StreamWriter(stream).. 我认为这是你所需要的。我不需要任何 Telnet 应用程序来实现这一点.. stackoverflow.com/questions/60932425/i-cant-send-an-e-mail/…
  • @itsme86 你如何发送这些命令?就像你发送一个普通的文本命令一样?
  • 我正在写一个例子.. 请等几分钟

标签: c# echo telnet parrot


【解决方案1】:

好的,给你一个小例子。方法AskReceive 发送一个命令并等待 200 英里秒的响应。它使用 Stream 来发送和接收。如果您发送clearTextWriter.WriteLine(commandline),则您正在向您的设备发送字符串命令。

using System;
using System.IO;
using System.Net.Sockets;


namespace CommonCore.Classes.Helper
{
    class TelnetDevice01
    {
        static int connectionTimeout = 1300;

        string AskReceive(string commandline, ref string _log)
        {
            _log += "> " + commandline + Environment.NewLine;
            clearTextWriter.WriteLine(commandline);

            string _str;

            System.Threading.Thread.Sleep(200);

            _str = clearTextReader.ReadLine();
            _log += "< " + _str + Environment.NewLine;

            return _str;
        }

        void ExitError(string str, ref string _log, ref string _error)
        {
            _error = str;
            _log += "!! Error : " + str + Environment.NewLine + Environment.NewLine;
            clearTextWriter.WriteLine("QUIT");

        }

        StreamReader clearTextReader = null;
        StreamWriter clearTextWriter = null;

        public void ConnectTelnet(string login, string password, string server, int port,
            out string log, out string resume, out string error
            )
        {

            string _response = "";

            resume = "";
            error = "";
            log = "";
            TcpClient client = new TcpClient();

            //Make the connection with timeout
            if (!client.ConnectAsync(server, port).Wait(connectionTimeout))
            {
                //log = ex.ExceptionToString();
                error = $"Could not connect '{server}' at port '{port}'";
                log += Environment.NewLine + error + Environment.NewLine;
                resume = Environment.NewLine + $"[FAIL] Port={port}. Could not connect '{server}' at port '{port}'" + Environment.NewLine;
                return;
            }

            using (client)
            {

                using (NetworkStream stream = client.GetStream())
                using (clearTextReader = new StreamReader(stream))
                using (clearTextWriter = new StreamWriter(stream) { AutoFlush = true })
                {
                    log += Environment.NewLine + Environment.NewLine + "## Connected" + Environment.NewLine;

                    //Read the start response line like "User:" ?'
                    string connectResponse = clearTextReader.ReadLine();
                    log += "< " + connectResponse + Environment.NewLine;
                    if (!connectResponse.StartsWith("login"))
                    {
                        ExitError(_response, ref log, ref error);
                        resume = Environment.NewLine + $"Expecting 'login'";
                        return;
                    }

                    //Send login
                    if (!(_response = AskReceive(login, ref log)).StartsWith("password"))
                    {
                        ExitError(_response, ref log, ref error);
                        resume = Environment.NewLine + $"Asnswer should have been 'password'";
                        return;
                    }

                    // Is asking for password, let's send the pass now
                    if (!(_response = AskReceive(password, ref log)).StartsWith("Login OK"))
                    {
                        ExitError(_response, ref log, ref error);
                        resume = Environment.NewLine + $"Answer should have been 'Login OK'";
                        return;
                    }

                    //Send CMD SMDR
                    _response = AskReceive($"SMDR", ref log);

                    //Check if the answer is what you want
                    // like _response.Contains("blabla")

                }

            }
        }

    }
}

【讨论】:

  • 感谢您的努力。我确实有一个我目前正在使用的 C# 包:PrimS.Telnet 和 Minimalistic.Telnet;他们在很多 telnet 服务器上工作得很好,但我有一台 telnet 服务器,它的回显。所以我的问题是如何转换这些字节码(Telnet 命令),以便我可以使用当前的发送方法发送它们?
  • 对于我阅读的内容(我不是专家),您必须禁用来自客户端或服务器的回显。在 Windows telnet 客户端上,它是命令 u localechounset localecho
猜你喜欢
  • 2014-04-15
  • 2018-07-10
  • 2013-09-09
  • 2021-07-22
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多