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

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

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

它似乎工作正常,但我还想通过 shell 与 memcached 进行通信,以检查它是否正在执行我认为它正在执行的操作。

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

$ echo "stats settings" | nc localhost 11211

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

在我的笔记本电脑(运行 OS X Lion)上,nc和都有使用域套接字的telnet选项(分别为-U和)。-u然而,在我的 Debian Squeeze Web 服务器上,这些选项不存在。

答案1

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

$ socat - UNIX-CONNECT:/tmp/memcached.sock

答案2

有了netcat-openbsd,就有一个-U选项。如果您没有,您可能已经netcat-traditional安装了;我建议切换。

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

答案3

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


同样,在使用 时socat,请使用 UNIX-CLIENT 选项。使用此选项您可以连接到两者UNIX域流UNIX域数据报插座。从它的手册页(曼·索卡特),”它首先尝试连接,如果失败,则假定它是数据报套接字,因此支持这两种类型”。

socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type

答案4

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

$ echo "stats slabs" | nc local:/tmp/memcached.sock
STAT active_slabs 0
STAT total_malloced 0
END

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

相关内容