一个用于将数据通过socket传输的标准Unix命令行工具

24
我有一些应用程序和标准的Unix工具,将它们的输出发送到在Solaris中的命名管道上,但是命名管道只能从本地存储读取(在Solaris上),所以我无法通过网络访问它们,也不能将管道放置在NFS存储上以便通过网络访问其输出。
这让我想知道是否有一种类似的方法可以直接将命令行工具的输出转发到套接字,例如:
mksocket mysocket:12345
vmstat 1 > mysocket 2>&1
5个回答

28

Netcat 是一个很好的工具。这里有一个常见用法示例页面

对于您的情况,使用方法可能类似于以下内容:

  1. 服务器监听连接,然后将输出发送到连接:

    server$ my_script | nc -l 7777

  2. 远程客户端连接到端口7777的server,接收数据,保存到日志文件中:

    client$ nc server 7777 >> /var/log/archive


16

Netcat(也称为nc)正是您寻找的工具。它逐渐成为标准工具之一,但并非所有系统都可用。

Socat 似乎是 netcat 的增强版本,具有更多功能,但比较少见。

在 Linux 上,您还可以使用 /dev/tcp/<host>/<port>。有关详细信息,请参见Advanced Bash-Scripting Guide


1
值得一提的是,/dev/tcp 是 Bash 的一个特殊功能,在 Linux 上并不适用于所有的 shell。 - icco

6

Netcat可以帮助在网络上建立一个管道。


4

您可以使用以下之一:

  1. ssh:安全(加密),在Solaris上已经预装 - 但您必须为非交互式会话设置密钥对
    • 例如:vmstat 2>&1 | ssh -i private.key oss@remote.node "cat >vmstat.out"
  2. netcat:简单易用 - 但不安全且容易受到攻击

1
谢谢你的 SSH 回答,在这种情况下安全不是问题,但把它放在问题中是很好的。 - Robert Gould

0

大家对于netcat的使用都很正确。但我想补充一点,如果你正在将内容通过管道传输到nc并期望得到响应,则需要使用-q <seconds>选项。从手册中可以看到:

-q seconds

在stdin上的EOF之后,等待指定的秒数然后退出。如果秒数为负数,则永久等待。

例如,如果您想与SSH代理进行交互,可以执行以下操作:

echo -en '\x00\x00\x00\x01\x0b' | nc -q 1 -U $SSH_AUTH_SOCK | strings

更完整的示例请参见https://gist.github.com/RichardBronosky/514dbbcd20a9ed77661fc3db9d1f93e4

* 我从https://ptspts.blogspot.com/2010/06/how-to-use-ssh-agent-programmatically.html中借鉴了这个示例


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