用于测试多个地址和端口的 Bash 脚本 telnet

Posted

技术标签:

【中文标题】用于测试多个地址和端口的 Bash 脚本 telnet【英文标题】:Bash script telnet to test multiple addresses and ports 【发布时间】:2014-06-18 18:29:45 【问题描述】:

我需要测试至少 130 个 IP 地址和端口。 我希望编写一个 bash 脚本,以便从输入文件中读取 IP 地址和端口。

我有以下

while read line
do
telnet $line >> $2
done < $1

这是一个糟糕的代码,因为它无法确定它是连接还是失败,我必须依靠它的自动转义字符来断开连接。

我怎样才能即兴发挥它,以便它快速更新 $2 的状态? 我正在使用 Redhat 并且没有安装 netcat 或期望安装..

【问题讨论】:

为什么不直接使用nmap 为什么不使用Netcat? 我尝试在有效的 ip 和端口上使用 nmap。得到以下信息:在 2014-05-02 06:15 UTC 开始 Nmap 5.51 (nmap.org) 注意:主机似乎已关闭。如果它真的启动了,但阻止了我们的 ping 探测,请尝试 -Pn Nmap done: 1 IP address (0 hosts up) 在 3.04 秒内扫描 没有安装 Netcat 的 root 权限 @ElliottFrisch 因为OP特别说netcat不是一个选项。 【参考方案1】:

正如其他 ***er 所说,如果可用,我建议使用 nmapnetcat。 但是,如果你不能使用这些软件,你可以使用 bash 的内置 /dev/tcp/&lt;host&gt;/&lt;port&gt; 来代替。

http://www.gnu.org/software/bash/manual/bashref.html#Redirections

我不知道您使用的是哪个版本的 bash,但 /dev/tcp/... 似乎是从一些旧 bash 开始实施的。

#!/bin/bash
echo "scanme.nmap.org 21
scanme.nmap.org 22
scanme.nmap.org 23
scanme.nmap.org 79
scanme.nmap.org 80
scanme.nmap.org 81" | \
while read host port; do
  r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
  if [ "$r" = "0" ]; then
    echo $host $port is open
  else
    echo $host $port is closed
  fi
done

这会产生

scanme.nmap.org 21 is closed
scanme.nmap.org 22 is open
scanme.nmap.org 23 is closed
scanme.nmap.org 79 is closed
scanme.nmap.org 80 is open
scanme.nmap.org 81 is closed

更新:以下可以做超时。 虽然看起来有点棘手,但想法只是在超时后终止子进程。

Bash script that kills a child process after a given timeout

#!/bin/bash
echo "scanme.nmap.org 80
scanme.nmap.org 81
192.168.0.100 1" | (
  TCP_TIMEOUT=3
  while read host port; do
    (CURPID=$BASHPID;
    (sleep $TCP_TIMEOUT;kill $CURPID) &
    exec 3<> /dev/tcp/$host/$port
    ) 2>/dev/null
    case $? in
    0)
      echo $host $port is open;;
    1)
      echo $host $port is closed;;
    143) # killed by SIGTERM
       echo $host $port timeouted;;
     esac
  done
  ) 2>/dev/null # avoid bash message "Terminated ..."

这会产生

scanme.nmap.org 80 is open
scanme.nmap.org 81 is closed
192.168.0.100 1 timeouted

因为 192.168.100 在我的本地网络中不存在。

【讨论】:

有没有办法同时回显那些无法访问的主机?这很好,但还需要以某种方式确定服务器是否可以与目标主机通信我有几个超时的主机 我添加了超时选项。 它是在 bash-2.04-devel (ChangeLog) 中实现的,所以如果你知道你运行的是 bash 而不是其他一些 shell,那么它已经足够老了,你几乎可以依赖拥有该功能。

以上是关于用于测试多个地址和端口的 Bash 脚本 telnet的主要内容,如果未能解决你的问题,请参考以下文章

用于测试给定用户是不是可以读取目录和其中所有文件的 Bash 脚本?

反弹shell小结

如何测试用于设置新机器的 bash 脚本

具有多个命令和可重入的 BASH 变量

脚本Windows批量验证TCP端口连通性

网络,进程,脚本