使用netcat将Unix套接字导入到TCP套接字

9

我正在尝试使用以下命令将Unix套接字公开为TCP套接字:

nc -lkv 44444 | nc -Uv /var/run/docker.sock

当我尝试从浏览器访问localhost:44444/containers/json时,它不会加载任何东西,但保持连接打开(加载图标一直在旋转),但控制台(因为-v标志)显示正确的http响应。你有什么想法可以让它正常工作吗?
注:我知道我可以使用socat,或者告诉docker也监听一个tcp套接字,但我正在使用项目原子vm映像,除了/home以外,它不允许我修改任何内容。

您的浏览器需要一个正确的HTTP响应,它由标题块和正文内容组成。只有当您的内容输出至少一个空行时,浏览器才会看到“正文”内容,否则它将一直等待。 - Marc B
3
管道只能单向传输...左边的netcat无法从右边的netcat获取输出。左边的netcat正在从您的原始stdin(终端?)读取。 - user2404501
1个回答

15

你只是重定向了传入的数据,而没有重定向传出的数据。 请尝试使用:

mkfifo myfifo
nc -lkv 44444 <myfifo | nc -Uv /var/run/docker.sock >myfifo

请参见http://en.wikipedia.org/wiki/Netcat#Proxying

编辑:在脚本中,您需要随机生成FIFO的名称,并在打开后将其删除:

FIFONAME=`mktemp -u`
mkfifo $FIFONAME
nc -lkv 44444 < $FIFONAME | nc -Uv /var/run/docker.sock > $FIFONAME &
rm $FIFONAME
fg

谢谢!这很好用。另外,我太蠢了 X-D。只是为了补充一些东西到你的答案中,我运行了两个命令:rm -f /tmp/myfifo; mkfifo /tmp/myfifo && nc -lkv 44444 </tmp/myfifo | nc -Uv /var/run/docker.sock >/tmp/myfifo。 - crashandburn
1
如果您正在编写脚本,使用 mktemp -u 生成一个名字,这个名字保证是一个不存在的文件。 - pqnet
很好,我使用这个来打开我的Docker远程端口2375。 - dormi330

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