【问题标题】:A script to test for traffic from a streaming server?用于测试来自流服务器的流量的脚本?
【发布时间】:2015-01-17 05:01:47
【问题描述】:

我有一个将数据从 tcp 端口流出的仪器,我想在脚本中使用标准工具来确定流是否可用。

我手动使用ncat,如果数据流不可用,它会立即退出。

这是我最初的 bash 脚本:

#!/bin/bash
ncat somehost 1234 >/dev/null &
pid=$!
sleep 1
if [ -d /proc/$pid/ ]; then
  kill -KILL $pid
  echo "It's alive, ALIVE\!"
  # Launch clients
else
  echo "He's dead, Jim."
  # Perform resurrection
fi

它有效,但我想知道是否有更简单或更好的方法来完成此任务,它不依赖于作业控制或 procfs 甚至 ncat。我还想知道在超时到期之前发送了多少数据。

而且,是的,在 bash 中 ncat host port 可以替换为 cat </dev/tcp/host/port,但我也想避免 bash-isms(这样它可以在busybox下工作)。

另一种方法是使用wc 来计算ncat 输出的行数/字符数,因为它只输出一行并在无法建立连接时退出。但是,如果流启动,我不能永远等待终止,所以我需要使用类似 timeout 的东西,这在尝试访问命令的输出时有其自身的复杂性。

是否有一种“简单”的方法可以使用最少的依赖项?

或者我应该写一个简单的工具来代替?如果与主机/端口建立连接,它将返回读取的字节数,否则返回负 errno,并支持等待时间和协议规范 (tcp/udp)。返回值 0 表示已建立连接,但在等待时间到期之前没有数据到达(这是一件好事)。

或者也许修补 ncat 来完成上述操作?

【问题讨论】:

  • 可以将ncat 输出重定向到head -n 3,而不是timeout,这将在3 行之后导致管道错误(指示活动流)。可惜ncatSIGPIPE的反应很差,处理bash的信号错误是个PITA。

标签: linux bash busybox network-traffic


【解决方案1】:

我使用netcat in FreeBSD,它有一个-z 选项,可以简单地检查端口是否打开。这消除了您在脚本中使用的背景和睡眠。

  -z   Specifies that nc should just scan for listening daemons, without
       sending any data to them.

该选项存在于此处旧 Ubuntu 机器上的 netcat 中,因此这可能是您的一个选项。

$ nc -z somehost 1234 && echo "It's alive, ALIVE!"

我在ncat 中看不到等效选项。你也许可以将netcat编译成busybox;它比ncat 小得多,至少在我的系统上是这样:

Linux:

$ ls -lH `which nc ncat`
-rwxr-xr-x 1 root root  31296 2010-02-21 01:32 /bin/nc
-rwxr-xr-x 1 root root 130448 2009-11-06 04:39 /usr/bin/ncat

FreeBSD:

ls -l `which nc ncat`
-r-xr-xr-x  1 root  wheel   28112 Jan 15 14:53 /usr/bin/nc
-rwxr-xr-x  1 root  wheel  182775 Mar 19  2012 /usr/local/bin/ncat

当然,这并不能帮助您检查通过流的流量或分析其内容。为此,我认为您的解决方案具有创新性和合理性,尽管您提出的挑战可能不容易解决。

您可以使用ps 来避免对procfs 的依赖,您可以将内容存储在临时文件中以供分析。请注意,busybox 应该包含mktemp,但您可能应该检查选项。我还没有测试过这个:

#!/bin/sh

TMPFILE=`mktemp /tmp/str.XXXX`
trap "rm -f $TMPFILE" 0 1 2 3 15

nc somehost 1234 > $TMPFILE &
pid=$!
sleep 1

if ps $pid >/dev/null; then
  kill -KILL $pid
  echo -n "It's alive, "
  if [ -s $TMPFILE ]; then
    echo "ALIVE!"
  else
    echo "but unresponsive."
  fi
else
  echo "He's dead, Jim."
fi

这就是我所拥有的。它和你已经拥有的并没有太大的不同。

另一种选择可能是构建一个自定义工具,您可以将其编译到您自己的 busybox 中,但这将是一个 问题而不是 问题。 :-)

【讨论】:

  • 我已经拥有了一个工具所需的大部分 C 代码,所以我可能会这样做。
  • 使用“nc -w 1 -z somehost 1234”会加快速度,只要每秒至少有一次数据。
  • 啊,是的,完美的-w 提供连接超时和空闲检测。很高兴我能帮助带回经典。 ;-) 接下来,我很乐意回答您的awksed 问题!
  • ncat 可以通过一个虚拟的-c 选项模拟nc -z(这可以防止端口流量无休止地喷涌而出)。以下将退出状态 ($?) 静默设置为 0 表示成功(端口上有可用流量)和 1 表示失败(无连接):ncat -w 1 -c "echo" >/dev/null 2>&1。需要重定向才能消费ncat的失败消息。
  • 继续我之前的评论:-w 选项按预期工作,但如果与-u (udp) 一起使用,请确保还包含与-w 具有相同值的-i (默认-w 值为6 秒,尽管-i 没有默认值)。
猜你喜欢
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多