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 脚本)的主要内容,如果未能解决你的问题,请参考以下文章
Centos 开放端口 查看 防火墙 ping telnet