如何通过 Debian Squeeze 上的 shell 与 Unix 域套接字通信?

Pau*_*ite 127 shell debian telnet socket

我正在运行 Debian Squeeze Web 服务器。我已经在其上安装了 memcached,并将 memcached 配置为侦听 Unix 域套接字(at /tmp/memcached.sock),因为它只需要从位于同一服务器上的网站接收消息。

它似乎工作正常,但我也想通过 shell 与 memcached 通信,以检查它是否在做我认为它在做的事情。

memcached 通过简单的 ASCII 协议接受消息(如果我理解正确的话)。如果它正在侦听 TCP/IP,我可以通过以下方式向它发送消息nc

$ echo "stats settings" | nc localhost 11211
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将该文本发送到域套接字。

在我的笔记本电脑(运行OS X Lion中),都nctelnet有选择(-U-u分别)使用域套接字。但是,在我的 Debian Squeeze Web 服务器上,这些选项不存在。

max*_*zig 113

使用socat(“两个数据通道之间的双向数据中继”),您可以像这样连接到 unix 域套接字:

$ socat - UNIX-CONNECT:/tmp/memcached.sock
Run Code Online (Sandbox Code Playgroud)


der*_*ert 94

有了netcat-openbsd,就有了-U选择。如果你没有它,你可能已经netcat-traditional安装了;我建议换。

示例命令: nc -U /var/run/socket

  • @AlexanderMills 如果你告诉它听(`-l`),它会创建文件。否则,它期望套接字已经存在(并且已经有一些东西在监听它)。所以答案中的示例命令不会创建文件。 (4认同)

Sah*_*ngh 26

netcat-openbsd支持连接到 UNIX 域套接字。使用它,您可以连接到UNIX 域流套接字UNIX 域数据报套接字,因此您必须将套接字的类型告诉 netcat。

例如,/dev/logLinux 中的文件是一个UNIX 域数据报套接字套接字,因此nc -U /dev/log 不起作用。而是使用nc -uU /dev/log. 使用 -u 和 -U 告诉 netcat 它是一个 UNIX 域数据报套接字。

nc -U /tmp/socket  #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
Run Code Online (Sandbox Code Playgroud)


同样,在使用 时socat,请使用 UNIX-CLIENT 选项。使用此选项,您可以连接到UNIX 域流UNIX 域数据报套接字。从其手册页(man socat) 中,“它首先尝试连接,如果失败,则假定它是数据报套接字,从而支持这两种类型”。

socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Run Code Online (Sandbox Code Playgroud)


sen*_*nfo 17

您可以在 Debian 上使用socat。要安装它:

# apt-get install socat
Run Code Online (Sandbox Code Playgroud)


小智 9

如果你碰巧在一个只安装了 busybox 的系统上,它可能看起来不支持 unix 域套接字(该-U选项不存在)但我发现以下工作:

$ echo "stats slabs" | nc local:/tmp/memcached.sock
STAT active_slabs 0
STAT total_malloced 0
END
Run Code Online (Sandbox Code Playgroud)

这对于为 alpine 容器创建健康检查非常有帮助。


cev*_*ing 6

发送请求“GET”到套接字“/tmp/server.sock”并打印结果:

printf GET | socat UNIX-CONNECT:/tmp/server.sock -
Run Code Online (Sandbox Code Playgroud)