【问题标题】:telnet to determine open ports (shell script)telnet 确定开放端口(shell 脚本)
【发布时间】:2014-09-20 03:48:35
【问题描述】:

我正在尝试编写一个 shell 脚本,它以 IP 地址和端口号作为输入并输出端口是否在主机上打开。我的 shell 脚本看起来像这样

#!/bin/bash

name=$(echo exit | telnet $1 $2 | grep "Connected")

if [ "$name" == "" ]
then
    echo "Port $2 is not open on $1"
else
    echo "Port $2 is open on $1"
fi

它工作正常,但我的输出包含 2 行,如下所示:

[root@ip-172-31-8-36 Scripts]# ./test.sh 172.31.35.246 7199
Connection closed by foreign host.
Port 7199 is open on 172.31.35.246

[root@ip-172-31-8-36 Scripts]# ./test.sh 172.31.35.246 7200
telnet: connect to address 172.31.35.246: Connection refused
Port 7200 is not open on 172.31.35.246

我想在这两种情况下抑制输出的第一行。 知道怎么做吗?

【问题讨论】:

  • 为什么不直接使用nmap 实用程序?
  • @cdhowie 我们公司的基础设施团队不会在系统上安装 nmap,所以我不得不使用 telnet

标签: linux bash telnet rhel


【解决方案1】:

telnet的错误输出指向/dev/null

name=$(echo exit | telnet $1 $2 2>/dev/null | grep "Connected")

【讨论】:

  • 这是旧的,但我想知道一开始使用echo exit 的目的是什么?不应该是echo quit 还是什么?
  • @FredrickGauss 什么? exit 是 Linux shell 自行终止的常用指令。是什么让您认为quit 会更好?
  • 是什么让我觉得它会是quit,因为quit是成功连接到服务器后的telnet命令。 telnet之前第一阶段发出的echo exit命令的目的我其实没看懂。
  • @FredrickGauss quit 是一个远程登录命令。但是,向 telnet 发出命令需要先输入转义码。 exit 在这种情况下用于远程外壳,即在目标服务器上远程执行的外壳。
  • 好吧,为什么 echo quit | ..echo blabla | .. 甚至 echo | .. 在这种情况下也有效?
【解决方案2】:

改用netcat 怎么样?

$ nc -v -z <host> <port> Connection to <host> <port> port [tcp/https] succeeded!

【讨论】:

    【解决方案3】:

    穷人的 nmap 纯 bash:

    host="127.0.0.1"
    for port in {1..1024}
    do
        echo "" > /dev/tcp/$host/$port && echo "Port $port is open"
    done 2>/dev/null
    

    【讨论】:

    • @jm66 我在 linux 中没有看到任何 /dev/tcp 目录
    • @c4f4t0r 这是bash 的内部功能,不是真正的目录。
    • @jm666 这是 bash 4 的未来吗?
    • @c4f4t0r no - 也适用于 3.2.51(1)。你的bash 必须用--enable-net-redirections 编译(但是,我从未见过没有安装)。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2013-08-18
    • 2015-06-28
    • 2015-08-15
    相关资源
    最近更新 更多