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

如何通过 bash 脚本快速确定端口 445 是否在服务器上打开/监听。

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

很高兴知道一种不先枚举然后再使用 greps 的方式。

最佳答案

我最近发现的一个惊喜是 Bash 原生支持 tcp connections as file descriptors .使用方法:

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

我使用 6 作为文件描述符,因为 0,1,2 是标准输入、标准输出和标准错误。 Bash for child processes 有时使用 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

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

根据您的用例修改此设置,例如发送电子邮件、在失败时退出脚本或启动所需的服务。

https://stackoverflow.com/questions/9609130/

相关文章:

python - 如何在 Python3 中将 'binary string' 转换为普通字符串?

python - 出错时自动启动 python 调试器

linux - 在 Bash 的文件路径参数中获取最后一个目录名/文件名

python - 如何在 Python 中分析内存使用情况?

linux - 如何在bash中将所有子目录中的所有文件gzip到一个压缩文件中

linux - 如何从我的应用程序目录中删除所有 .svn 目录

linux - 从管道将值读入 shell 变量

python - 在 pandas DataFrame 中查找列的值最大的行

linux - 从 grep 中排除 .svn 目录

python - 使用 matplotlib 在单个图表上绘制两个直方图