从一个bash脚本如何快速查找端口445是否在服务器上打开/监听。
我已经试过几个办法了,但我想快点: 1. lsof -i:445(需要数秒) 2. netstat -an |grep 445 |grep LISTEN(需要数秒) 3.Telnet(不返回) 4. 服务器上没有Nmap、netcat
知道一种不先枚举然后再grep的方法将会很好。
从一个bash脚本如何快速查找端口445是否在服务器上打开/监听。
我已经试过几个办法了,但我想快点: 1. lsof -i:445(需要数秒) 2. netstat -an |grep 445 |grep LISTEN(需要数秒) 3.Telnet(不返回) 4. 服务器上没有Nmap、netcat
知道一种不先枚举然后再grep的方法将会很好。
当前回答
我最近发现的一个惊喜是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是stdin、stdout和stderr。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
要确定是否有人正在监听,请尝试通过环回连接。如果失败了,端口就会被关闭,或者我们不允许进入。然后,关闭连接。
根据您的用例修改它,例如发送电子邮件、在失败时退出脚本或启动所需的服务。
其他回答
你可以使用netcat。
nc ip port < /dev/null
连接到服务器,然后直接重新关闭连接。如果netcat不能连接,它将返回一个非零退出码。退出码存储在变量$?举个例子,
nc ip port < /dev/null; echo $?
当且仅当netcat成功连接到端口时返回0。
基于Spencer Rathbun的回答,使用bash:
true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
这里有一个非常简短的“快速回答”:如何测试远程TCP端口是否从Shell脚本打开?
nc -z <host> <port>; echo $?
我使用127.0.0.1作为“远程”地址。
如果端口是开放的,返回“0”,如果端口是关闭的,返回“1”
e.g.
nc -z 127.0.0.1 80; echo $?
-z指定nc只扫描监听守护进程, 没有发送任何数据给他们。使用此选项是错误的 conjunc - 带有-l选项的Tion。
Nmap是正确的工具。 简单地使用nmap example.com -p 80
您可以从本地或远程服务器使用它。 它还可以帮助您识别防火墙是否正在阻止访问。
下面是一个适用于Mac和Linux的方法:
netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'