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

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

很高兴知道一种不会先枚举然后在此之后摸索的方式。

最佳答案

我最近发现的一个惊喜是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是stdin,stdout和stderr。 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

要确定是否有人在监听,请尝试通过环回进行连接。如果失败,则说明该端口已关闭或不允许我们访问。然后,关闭连接。

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

07-28 04:08