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


99

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

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

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

$ echo "stats settings" | nc localhost 11211

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

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

Answers:


72

使用netcat-openbsd,有一个-U选项。如果您没有安装,则可能已netcat-traditional安装。我建议切换。

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


因此netcat将在以下位置创建一个新文件/var/run/socket?有没有办法重用现有文件?
亚历山大·米尔斯

1
@AlexanderMills如果告诉它监听(-l),它将创建文件。否则,它期望套接字已经存在(并且已经在监听它)。因此,答案中的示例命令不会创建文件。
derobert

94

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

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

19

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域数据报套接字。从它的手册页(man socat)中,“ 它首先尝试连接,如果失败,则假定它是一个数据报套接字,从而支持两种类型 ”。

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

1
它是令人惊讶的灵活,可参数化的工具。
user259412

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.