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

标签 linux bash shell port

如何通过 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

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

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

关于linux - 有效地测试一个端口是否在 Linux 上打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9609130/

相关文章:

c - sndfile.h中的sf_count_t类型在libsndfile中是怎么定义的?

bash - 用 bash 脚本注释掉/fstab 中的行

ubuntu - 我如何运行 cron 并检查当前正在运行的 cron

json - 使用 Unix 工具解析 JSON

shell - $$在shell中是什么意思?

java - 在linux上用java运行shell脚本

java - 让 Java 在 Cygwin 中工作

linux - 服务器扩展如何在 X 中工作?

arrays - Bash 关联数组中带有空格的键

linux bash - 以自定义格式解析日期