[英]Efficiently test if a port is open on Linux?
从 bash 脚本如何快速找出端口445
是否在服务器上打开/侦听。
我尝试了几个选项,但我想要一些快速的东西:
1. lsof -i :445
(需要几秒钟)
2. netstat -an |grep 445 |grep LISTEN
(需要几秒钟)
3. telnet
(不返回)
4. nmap
, netcat
在服务器上不可用
很高兴知道一种不先枚举然后不枚举的方法。
我最近发现的一个惊喜是 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 是标准输入、标准输出和标准错误。 5 有时被Bash 用于子进程,因此 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
要确定是否有人在侦听,请尝试通过回送进行连接。 如果失败,则端口已关闭或不允许我们访问。 之后,关闭连接。
针对您的用例修改此设置,例如发送电子邮件、失败时退出脚本或启动所需的服务。
这里有一个非常简短的“快速答案”: 如何测试是否从 Shell 脚本打开了远程 TCP 端口?
nc -z <host> <port>; echo $?
我将它与 127.0.0.1 一起用作“远程”地址。
如果端口打开则返回“0”,如果端口关闭则返回“1”
例如
nc -z 127.0.0.1 80; echo $?
-z指定 nc 应该只扫描监听守护进程,而不向它们发送任何数据。 将此选项与 -l 选项结合使用是错误的。
您可以通过这种方式使用 netstat 以获得更快的结果:
在 Linux 上:
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
在 Mac 上:
netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
这将输出侦听端口的进程列表(在本例中为 445),或者如果端口空闲则不输出任何内容。
您可以为此使用 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
它们列在 /proc/net/tcp 中。
它是第二列,在“:”之后,以十六进制表示:
> cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 10863 1 ffff88020c785400 99 0 0 10 -1
1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7983 1 ffff88020eb7b3c0 99 0 0 10 -1
2: 0500010A:948F 0900010A:2328 01 00000000:00000000 02:00000576 00000000 1000 0 10562454 2 ffff88010040f7c0 22 3 30 5 3
3: 0500010A:E077 5F2F7D4A:0050 01 00000000:00000000 02:00000176 00000000 1000 0 10701021 2 ffff880100474080 41 3 22 10 -1
4: 0500010A:8773 16EC97D1:0050 01 00000000:00000000 02:00000BDC 00000000 1000 0 10700849 2 ffff880104335440 57 3 18 10 -1
5: 0500010A:8772 16EC97D1:0050 01 00000000:00000000 02:00000BF5 00000000 1000 0 10698952 2 ffff88010040e440 46 3 0 10 -1
6: 0500010A:DD2C 0900010A:0016 01 00000000:00000000 02:0006E764 00000000 1000 0 9562907 2 ffff880104334740 22 3 30 5 4
7: 0500010A:AAA4 6A717D4A:0050 08 00000000:00000001 02:00000929 00000000 1000 0 10696677 2 ffff880106cc77c0 45 3 0 10 -1
所以我猜第三列中的其中一个:50
必须是 stackoverflow :o)
查看man 5 proc
以获取更多详细信息。 并用 sed 等将其分开作为温和读者的练习......
ss -tl4 '( sport = :22 )'
2ms够快吗?
添加冒号,这适用于 Linux
这是一种适用于 Mac 和 Linux 的方法:
netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'
nc -l 8000
其中 8000 是端口号。 如果端口空闲,它将启动一个您可以轻松关闭的服务器。 如果不是,它会抛出一个错误:
nc: Address already in use
我想检查我们的一台 linux 测试服务器上是否打开了一个端口。 通过尝试使用 telnet 从我的开发机器连接到测试服务器,我能够做到这一点。 在您的开发机器上尝试运行:
$ telnet test2.host.com 8080
Trying 05.066.137.184...
Connected to test2.host.com
在这个例子中,我想检查主机test2.host.com上的端口8080是否打开
tcping是一个很好的工具,开销非常低。它还具有超时参数以使其更快:
[root@centos_f831dfb3 ~]# tcping 10.86.151.175 22 -t 1
10.86.151.175 port 22 open.
[root@centos_f831dfb3 ~]# tcping 10.86.150.194 22 -t 1
10.86.150.194 port 22 user timeout.
[root@centos_f831dfb3 ~]# tcping 1.1.1.1 22 -t 1
1.1.1.1 port 22 closed.
您也可以使用 netcat 命令
[location of netcat]/netcat -zv [ip] [port]
要么
nc -zv [ip] [port]
-z - 将 nc 设置为简单地扫描监听守护进程,而不实际向它们发送任何数据。
-v – 启用详细模式。
nmap
是正确的工具。 只需使用nmap example.com -p 80
您可以从本地或远程服务器使用它。 它还可以帮助您确定防火墙是否阻止访问。
如果您使用的是 iptables,请尝试:
iptables -nL
要么
iptables -nL | grep 445
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.