我有一个工具,可以将数据流输出到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,则表示已建立连接,但在等待时间到期之前没有数据到达(这是一件好事)。
或者用patchncat来完成上面的工作?

最佳答案

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

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

该选项存在于NETCAT上的一个旧Ubuntu框这里,所以这可能是你的选择。
$ 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

免费订阅:
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问题,而不是shell问题。:-)

08-28 11:33