将应用程序输出重定向到unix套接字

k5hmc34c  于 2022-12-12  发布在  Unix
关注(0)|答案(2)|浏览(137)

我有一个套接字服务器,它创建unix套接字,然后从这个unix套接字读取数据。然后我有另一个长进程应用程序,我想重定向这个进程的stdout到我的unix套接字。我尝试了这个命令来测试

ping 127.0.0.1 > /tmp/unixsockettest.sock

但是我得到的是-bash: /tmp/unixsockettest.sock: No such device or address,有没有可能把应用程序输出重定向到unix socket?

h7wcgrx3

h7wcgrx31#

您不能使用shell i/o重定向来重定向到Unix套接字,但是可以使用socat之类的工具(它可能是为您的发行版打包的)来完成任务:

ping 127.0.0.1 | socat - unix-connect:/tmp/unixsockettest.sock
cczfrluj

cczfrluj2#

Shell重定向尝试将其目标文件open(),然后将得到的filedescriptor dup2()到正确的位置。不幸的是,UNIX套接字不能被open编辑。从UNIX套接字获取可写filedescriptor的方法(数据流或数据报)是以connect()向它(在您将路径填充到struct sockaddr_un中之后).不幸的是,Shell不能为您执行此操作,但是您可以将其插入到socatnetcat之类的工具中,然后将它们的管道输入铲入连接的套接字描述符。
例如,使用netcat,您可以:

ping 127.0.0.1 | nc -U /tmp/unixsockettest.sock #add -u it the socket isn't streaming but datagram

(对于操作系统设计者来说,拥有一个UNIX衍生版本,在其中打开套接字文件会连接到它们,这可能不是一个坏的设计选择。反对它的一个论点可能是,它可能会导致打开被阻止,并可能使它们打扰其他进程(绑定器),但无论如何,这两种情况都可能在命名管道中发生。)

相关问题