telnet 确定开放端口(shell 脚本)

Posted

技术标签:

【中文标题】telnet 确定开放端口(shell 脚本)【英文标题】:telnet to determine open ports (shell script) 【发布时间】: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 【参考方案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 编译(但是,我从未见过没有安装)。

以上是关于telnet 确定开放端口(shell 脚本)的主要内容,如果未能解决你的问题,请参考以下文章

Linux下怎样查看某一端口是不是开放?

Centos 开放端口 查看 防火墙 ping telnet

是用telnet ip 端口号的方式查看端口开放情况,怎样通过返回值判断?

从 shell 脚本生成交互式 telnet 会话

Python脚本--端口扫描器

Linux下,不用telnet命令,还有别的命令可以测试端口是不是开放吗