【问题标题】:Bash Script to Check Port Availability with Timestamp使用时间戳检查端口可用性的 Bash 脚本
【发布时间】:2015-02-07 05:05:51
【问题描述】:

在 Mac OS X 10.10 上使用 netcat,我想每分钟测试一次 Facilis TerraBlock 服务器上的侦听端口,以确认以太网侦听器正在运行。

我希望脚本输出一行表示成功,一行表示失败,并在前一行记录日期/时间戳。我目前不需要将任何这些记录到文件中。

像这些原生 nectat 输出这样的东西是理想的:

Wed Feb  4 10:49:09 EST 2015
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
nc: connectx to 10.40.255.12 port 859 (tcp) failed: Connection refused

这是我创建的脚本:

#!/bin/bash

date
nc -z 10.40.255.11 859 || nc -vz 10.40.255.11 859
nc -z 10.40.255.12 859 || nc -vz 10.40.255.12 859

while sleep 60; do date;nc -z 10.40.255.11 859 || nc -vz 10.40.255.11 859 & nc -z 10.40.255.12 859 || nc -vz 10.40.255.12 859; done

这个脚本的行为不可预测,我猜它是 ||操作员,但我找不到另一种方法来做到这一点。具体来说,当脚本运行时,终端输出在时间戳之后的第一个或第二个 .11 和 .12 测试之间交替,这让我想知道这是否只是 netcat 响应的连接超时导致回复偶尔出现顺序,或者如果有更大的问题并且我的脚本返回不可靠的数据。

这是我当前输出的一个示例:

Fri Feb  6 10:51:33 EST 2015
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
Connection to 10.40.255.12 port 859 [tcp/*] succeeded!
Fri Feb  6 10:51:34 EST 2015
Connection to 10.40.255.12 port 859 [tcp/*] succeeded!
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
Fri Feb  6 10:51:35 EST 2015
Connection to 10.40.255.12 port 859 [tcp/*] succeeded!
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
Fri Feb  6 10:51:36 EST 2015
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
Connection to 10.40.255.12 port 859 [tcp/*] succeeded!

我添加了 ||和 & 运算符,以及看似冗余的代码,因为我只想在连接失败时查看 netcat 的详细输出。

【问题讨论】:

  • 在你的 while 循环中删除 & 会发生什么?此评估将具有较少的“灵活性”,并且您应该获得更有序的列表。此外,它可能有助于编辑您的问题并包含您的首选输出以及您获得的当前输出。祝你好运。
  • 庇护所,如果我删除 & 运算符,脚本将只查询 .11 地址。我已经添加了当前输出。谢谢。
  • 哈,还有 1 个 & 不少于 1 个;-)。 (我的错)。 .... nc ...11 || nc ...11 && nc ...12 || nc ....12 应该强制评估至少 1 .11 addr 和 1. 12 addr?这有帮助吗?祝你好运。

标签: bash scripting osx-yosemite netcat


【解决方案1】:

您的脚本可能更可靠,如下所示:

#! /bin/bash

ips="10.40.255.11 10.40.255.11 10.40.255.12 10.40.255.12"

while  true ; do
  # This will make sure it will run every 60 seconds, not 60 seconds + whatever nc takes to execute
  sleep 60 & 
  date
  for ip in $ips; do
    # Note that we're using -w to timeout 
    out=$(nc -zvw 2 $ip 859 2>&1) && echo "$out" && break
  done || echo "$out"
  # This waits for sleep in background 
  wait
done

【讨论】:

  • Tiago,布局非常好。运行时,您的脚本似乎只测试 .11 地址。可能有一些中断导致它跳过 ips 列表中的剩余地址......
  • 我误解了你的要求,你能显示你想要的输出吗?
猜你喜欢
  • 2012-05-23
  • 2023-03-23
  • 1970-01-01
  • 2016-03-15
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2014-08-14
相关资源
最近更新 更多