小编典典

有效地测试一个端口是否在 Linux 上打开?

all

从 bash 脚本中,我如何快速找出端口是否445在服务器上打开/侦听。

我尝试了几个选项,但我想要一些快速的东西:
1. lsof -i :445 (需要几秒钟)
2. netstat -an |grep 445 |grep LISTEN(需要几秒钟)
3. telnet(它不返回)
4 nmap.,netcat在服务器上不可用

很高兴知道一种不先枚举然后再进行 greps 的方法。


阅读 71

收藏
2022-06-30

共1个答案

小编典典

我最近发现的一个惊喜是 Bash 原生支持tcp
连接作为文件描述符
。要使用:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

我使用 6 作为文件描述符,因为 0、1、2 是标准输入、标准输出和标准错误。Bash有时将
5用于子进程,因此 3、4、6、7、8 和 9
应该是安全的。

根据下面的评论,测试在脚本中侦听 本地服务器:

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

要确定是否有人在听,请尝试通过环回连接。如果失败,则端口将关闭或不允许我们访问。之后,关闭连接。

针对您的用例进行修改,例如发送电子邮件、在失败时退出脚本或启动所需的服务。

2022-06-30