是否可以将 Linux 中的 TCP 隧道公开为特殊字符设备?

Lap*_*sio 10 linux networking pipe tunneling character-special-files

最近我在 QNX 文档中发现它允许通过使用串行设备 ( dev/serX)在不同物理机器上的进程之间设置基于消息的 IPC ,这让我想知道:

是否可以在 Linux 中为 TCP/UDP 隧道创建系统范围的特殊设备?像ncstdin/stdout 这样的东西在 /dev/something 下公开公开。

最后,我希望能够在一台机器上向此类文件写入一些内容并在另一端接收它,例如:

#machine1:
echo "Hello" > /dev/somedev

#machine2:
cat < /dev/somedev
Run Code Online (Sandbox Code Playgroud)

我看了一下ncman,但没有找到任何选项来指定 stdio 以外的 io 源/目标。

Ale*_*ies 19

socat 可以用类似“流”的东西来做这个和许多其他的事情

使用这个基本思想的东西应该为你做:

Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave

Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321
Run Code Online (Sandbox Code Playgroud)

(改编自示例页面

如果你想加密,你可以ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork在 machine1 上使用一个变体,ssl:server-host:1443,cert=client.pem,cafile=server.crt在 machine2上使用类似的东西

(更多关于socat ssl


Ale*_*exP 7

消息传递需要在更高层实现;TCP 没有消息的概念——TCP 连接传输八位字节流。

你可以实现的东西排序像你要求什么nc命名管道,请参阅man mkfifo; 或socat按照 Alex Stragie 的指示进行检查。

如果没有中间层服务,基本问题是 (1) 数据无法写入网络,除非另一端有人在监听它,以及 (2) TCP 连接是双向的。

因为除非有人在侦听数据,否则您无法将数据写入网络,所以发送数据之前,您必须始终启动侦听器。(在消息传递系统中,处理消息的进程将提供某种缓冲。)

您的示例可以轻松重写:

如果您想以某种方式处理接收到的数据并做出响应,您可以使用 shell 的协处理设施。例如,这是一个非常简单(而且非常顽固)的 Web 服务器:

#! /bin/bash

while :; do
  coproc ncfd { nc -l 1234; }
  while :; do
    read line <&${ncfd[0]} || break
    line="$(
      echo "$line" |
      LC_ALL=C tr -cd ' -~'
    )"
    echo >&2 "Received: \"$line\""
    if [ "$line" = "" ]; then
      echo >&${ncfd[1]} "HTTP/1.0 200 OK"
      echo >&${ncfd[1]} "Content-Type: text/html"
      echo >&${ncfd[1]} "Connection: close"
      echo >&${ncfd[1]} ""
      echo >&${ncfd[1]} "<title>It works!</title>"
      echo >&${ncfd[1]} "<center><b>It works!</b></center>"
      echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
      break
    fi
  done
  kill %%
  sleep 0.1
done
Run Code Online (Sandbox Code Playgroud)

查看如何使用数组中的文件描述符在脚本主体和协进程之间实现双向通信$ncfd


Áng*_*gel 5

如果您只是想使用像 nc 这样的基本程序连接两台计算机,您可以重定向 from/to /dev/tcp/<host>/<port>

这些不是真正的设备,而是由 bash 创建的虚构作品,所以像这样的东西cat /dev/tcp/foo/19不会起作用,但cat < /dev/tcp/foo/19会起作用。