【问题标题】:Sending non-printable ASCII codes (like 0x80) through bash and Telnet通过 bash 和 Telnet 发送不可打印的 ASCII 代码(如 0x80)
【发布时间】:2015-03-07 02:26:56
【问题描述】:

我正在尝试通过 telnet 将不可打印的 ASCII 字符(代码 128 - 255)发送到使用 Socket 对象读取数据的 Ruby 应用程序。

当我尝试通过 telnet 发送 \x80 时,我希望 Ruby 收到一个 3 字节的字符串:128 13 10

我实际上收到了一个 6 字节的字符串:92 120 56 48 13 10

我是否需要更改 telnet 发送信息的方式或 Ruby 套接字如何接受信息?我已经阅读了所有我能理解的 telnet 术语。非常感谢您指出正确的方向。

【问题讨论】:

    标签: ruby sockets ascii telnet extended-ascii


    【解决方案1】:
    92 120 56 48 13 10
    

    是十进制ASCII:

    \  x   8  0  \r \n
    

    所以你做错了,它不是 Telnet。转义序列\x80 被按字面意思处理,而不是被理解为code=128 的单个字符。

    我猜你使用了'\x80' 而不是"\x80"。注意不同的引号。如果那是单个字符,您也可以在 Ruby 中使用 ? 字符来表示字符:?\x80 例如:

    "\x80\r\n" == ?\x80 + ?\r + ?\n
    => true
    

    当然

    '\x80\r\n' == "\x80\r\n"
    => false
    

    --

    总结一下来自 cmets 的长篇故事:

    • 原来要发送的数据是通过telnet终端手动输入的
    • telnet 终端通常不接受任何转义码,并且直接“发送”他们得到的所有内容,有时复制和粘贴带有特殊字符的文本会起作用,有时终端会提供一些额外的 UI 好东西来发送特殊字符 - 但这次终端是非常基本,粘贴不起作用,也没有 UI 好东西
    • 与手动输入数据不同,通过管道将文件发送到 telnet 终端似乎效果更好。一些数据到达,但不好
    • 将数据通过管道传输到nc(netcat) 而不是telnet 终端似乎几乎可以工作,二进制数据到达,但还不完美
    • 在用hexdump utility检查了输入文件(通过管道传送到nc的那个)后,发现文件包含的内容与我们想象的不完全一样,似乎用于创建文件的编辑器保存了错误的文本编码,并且它添加了一些额外的不需要的字节
    • 最后,utility called xxd 帮助从定制的十六进制文本中生成了良好的二进制数据; xxd 的输出可以直接通过管道传输到 nc (netcat)

    【讨论】:

    • 我是手动将十六进制代码输入 telnet,而不是通过 Ruby。它被 Ruby接受 并逐个字符地解释。我在问如何将特殊字符输入到 telnet 以便 Ruby 理解我的意思。
    • @BradRice:通常,你不能。但这在很大程度上取决于您使用的是什么终端。当您可以发出“现在发送此特殊字符”之类的命令时,智能终端通常会有一些侧面控制台或窗口。但是,如果您的没有类似的东西,那么唯一的事情就是尝试从可以处理它们的文本记事本中复制粘贴确切的字符或字符串。此外,您可以尝试将包含特殊字符文本的文本文件通过管道传输到终端,而不是手动键入它们。通常这更方便和可重复。或为此编写一个脚本或 (...)
    • terminal 我的意思是telnet terminal,而不是你的 Bash/console/etc 窗口。我的意思是您用来建立 telnet 连接的应用程序。 Telnet 是一种协议的名称,有许多不同的客户端(终端)来处理它。例如putty 可以,并且它支持粘贴特殊字符(前提是您设法将它们复制到剪贴板)。
    • 另外,如果你只是想让“Ruby 理解它”,那么将 \x80 作为四个字符直接发送并在 Ruby 中解析/翻译它。简单的 eval 就可以了,尽管它不是最安全的方法。但是如果你真的想通过网络发送一个二进制 charcode 128,你必须首先了解你的终端。
    • 明白了。好吧,将角色放入文件中会产生与我所看到的相同的结果。我在我的 Mac 终端上使用 telnet,所以我没有额外的帮助。不幸的是,我无法让 Ruby 为我拼凑数据。我需要能够自己发送特殊字符。
    猜你喜欢
    • 2014-11-02
    • 2020-11-12
    • 1970-01-01
    • 2011-05-30
    • 2017-10-30
    • 2016-05-15
    • 1970-01-01
    • 2011-05-08
    • 2014-09-01
    相关资源
    最近更新 更多