gpt4 book ai didi

linux - Linux 串行默认 shell 上的 IP 隧道

转载 作者:太空狗 更新时间:2023-10-29 12:30:46 27 4
gpt4 key购买 nike

这是 this 的更受限制的版本问题:

我有一个嵌入式 ARM 设备,它运行带有 Linux 3.10.0 内核的自定义镜像。

唯一的物理接口(interface)(没有、USB、没有以太网)是连接到串行接口(interface)之一的默认 Linux shell。

我的问题是:是否有任何内置或外部工具可以通过此连接打开 IP 隧道?

我看到一些一般性问题:

  • 该设备已被 Linux 使用,因此它必须使用 stdin/out 进行通信,而不是直接访问该设备。
  • 启动隧道应用程序后,应用程序必须等待隧道客户端连接,因为我需要关闭计算机上的串行连接,然后启动隧道客户端。
  • 应该有办法关闭连接并回到正常的shell

  • 实际要求是,我可以从通过串行电缆连接到嵌入式设备的计算机访问在嵌入式设备上运行的 REST 接口(interface)。

    这已经适用于具有物理以太网或 USB 以太网的设备,但该设备不提供。

    [更新]
    如前所述,socat 目前在我们的嵌入式设备上不可用,因此作为第一次尝试,我使用了以下内容:
  • 带有物理串行接口(interface)的 Linux (Ubuntu) 笔记本电脑
  • 带有物理串行接口(interface)和安装了 cygwin+socat 的 Windows 笔记本电脑
  • 两者都通过零调制解调器电缆连接

  • 注意:我在一侧使用 Windows 笔记本电脑,因为我们将在 Linux 上运行 socat 客户端(不幸的是)。
  • 直接 STDIO 连接

  • 服务器
    socat stdio file:/dev/ttyS0,b115200

    客户
    socat file:/dev/ttyS4,b115200 stdio

    在 cygwin 中, ttyS0COM1 , ttyS4在这种情况下是 COM5 .

    使用这些,socat 就像一个小聊天程序一样工作。为什么我在一侧输入是在另一侧输出,反之亦然。
  • TCP 连接

  • 下一步是使用 TCP 连接。

    服务器
    socat /dev/ttyS0,b115200,crtscts=1,raw,echo=0 tcp-connect:localhost:80

    客户
    socat -T2 file:/dev/ttyS4,b115200,crtscts=1,raw,echo=0 tcp-l:7777,reuseaddr

    我指定了波特率 (115200),使用了原始传输,没有使用硬件流控制回显(否则 HTTP 请求将被发送回请求者)。脓我不得不使用超时 -T2 2秒后终止连接。否则,curl 也不会终止并等待更多数据。

    当我在 windows 电脑上使用 curl 时,它成功地通过串行连接传输请求并返回 Linux 电脑上 HTTP 服务器的完整 HTTP 响应:
    curl localhost:7777/index.html

    但是,它只工作一次。请求完成后, socat客户端和服务器终止。

    此外,当我使用浏览器 (Chorme) 时,它使用最有可能发送二进制字符的 g-zip 编码。其中一个字符将是 EOF再次终止 socat 的字符在完成请求/响应之前。

    然后我尝试添加 fork到服务器:
    socat /dev/ttyS0,b115200,crtscts=1,raw,echo=0 tcp-connect:localhost:80,fork

    这使服务器保持事件状态,但 curl返回 400 Bad Request .所以看起来好像 socat服务器为每一行或每一 block 发起一个请求,因为它不理解 HTTP。
  • IP连接

  • 然后我想去下面一层并使用TUN连接。但是,这在 socat 的 Windows 版本上没有实现。 .
  • HTTP 连接

  • 如果我错了,请纠正我,但据我了解, socat不提供真正理解 HTTP 并且能够通过串行连接正确序列化它的连接类型。

    因此,我找不到任何稳定的方法来启动客户端和服务器并通过串行连接运行多个 HTTP 请求。

    最佳答案

    在普通的 linux 上,你可以使用 socat .

    该程序允许您连接多种流类型(文件、套接字、tcp、udp...)。在您的情况下,它将是 tcp 文件或更准确地说是端口 xx 到/dev/ttyUSB1 的 tcp 套接字。您应该在两侧启动 socat 以建立隧道。

    编辑 1:
    对不起,我也对 socat 感到失望。我找不到让我的 TCP 监听器对多个连续连接保持事件状态但一次只处理一个连接的解决方案。

    我的解决方案是一个使用 4 个线程的简单 C# 程序:
    1. 等待标准输入上的输入,例如退出命令
    2. TCP监听器
    3. 用于事件连接的 TCP 工作线程
    4.如果TCP打开,则为COM打开另一个线程

    线程 3 从 TCP 读取并写入 COM,线程 4 从 COM 读取并写入 TCP。如果线程收到 TCP 关闭事件,它会停止关闭 COMx 的线程 4,并自行退出。现在线程 2 可以接受一个新的连接。如果线程 1 在标准输入上读取 exit,它会向所有线程传递一条消息以停止和关闭。

    也许您可以在没有 socat 的嵌入式系统上使用 pthread 用 C 语言实现这样一个简短的程序。

    EOF问题:
    我试图用谷歌搜索一个程序,它可以转义特殊字符或将数据流从 ASCII 重新编码为 ANSI 或 base64 或其他......

    Server <=> reencode <=> socat <--serial--> socat <=> reencode <=> client

    关于linux - Linux 串行默认 shell 上的 IP 隧道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27837627/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com