如何从命令行访问Unix域套接字?

21

使用Python读取Unix域套接字文件与普通TCP套接字类似:

>>> import socket
>>> import sys
>>>
>>> server_address = '/tmp/tbsocket1'  # Analogous to TCP (address, port) pair
>>> sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
>>> sock.connect(server_address)
>>> sock.recv(512)
'*** uWSGI Python tracebacker output ***\n\n'

由于UDS不是普通文件,cat无法操作它们:

$ sudo cat /tmp/tbsocket1
cat: /tmp/tbsocket1: No such device or address

curl 也不行:

$ sudo curl /tmp/tbsocket1
curl: (3) <url> malformed

如何使用标准命令行工具(如curl)读取或写入Unix域套接字?

PS:在一个奇怪的巧合中,最近非常建议使用curl补丁

3个回答

28

您可以使用nmap项目中的ncat命令:

ncat -U /tmp/tbsocket1

为了方便访问,您可以这样做:

# forward incoming 8080/tcp to unix socket
ncat -vlk 8080 -c 'ncat -U /tmp/tbsocket1'
# make a http request via curl
curl http://localhost:8080
你也可以使用socat:
# forward incoming 8080/tcp to unix socket
socat -d -d TCP-LISTEN:8080,fork UNIX:/tmp/tbsocket1

我尝试使用这个。但是在应用程序日志中出现错误:“无效的请求块大小:21573(最大4096)跳过..”。是否可以将其用于:uwsgi_pass unix:///tmp/web2py.socket; - yogeshagr

9

nc -U </unix/socket> 几乎可以在任何 Linux、BSD、MacOS 上使用。


1
是的,不是Debian上的传统netcat。我不得不切换到支持Unix套接字的netcat-openbsd。请参见https://unix.stackexchange.com/questions/26715/how-can-i-communicate-with-a-unix-domain-socket-via-the-shell-on-debian-squeeze - Robert Cutajar

0

使用socat将传入的8080/tcp转发到Unix套接字:

NB:必须有一个进程在侦听/tmp/tbsocket1

socat UNIX-CONNECT:/tmp/tbsocket1 TCP-LISTEN:8080 & 
curl http://localhost:8080

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接