如何从bash脚本中快速找出服务器上端口445
是否开放/监听。
我尝试了几种方法,但都想要一些更快的方法:
1. lsof -i :445
(几秒钟内返回)
2. netstat -an |grep 445 |grep LISTEN
(几秒钟内返回)
3. telnet
(没有返回结果)
4. nmap
和netcat
在服务器上不可用
最好知道一种不需要枚举和筛选的方法。
exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6
exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection
&&
,那么它可以打印出端口是活动的,但由于其本质,该命令不知道谁拥有该端口。 - Spencer Rathbun/dev/tcp/IP/PORT
树的bash。 - dyasny这里有一个非常简短的“快速回答”:如何从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)上正在监听的进程列表,如果端口空闲则不会输出任何内容。
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
。 - anubhavaawk '$6 == "LISTEN" && $4 ~ "80$"'
。我使用了80$
来检查端口号前的点而不是用\ .80
。否则,这也会匹配包含.80
的IP地址和以80
开头的端口,如8000
。 - Patrick Oscityawk '$6 == "LISTEN" && $4 ~ "\.80$"'
。 - mklement0nc ip port < /dev/null
连接服务器并直接关闭连接。如果netcat无法连接,则返回非零的退出代码,该退出代码存储在变量$?中。例如:
nc ip port < /dev/null; echo $?
只有当netcat成功连接到端口时,才会返回0。
nc
命令有 -z
标志,可用于此目的,它不需要从 /dev/null
获取输入。上面已经有一个使用 -z
标志的答案。 - Abe Voelkernc -z
在 Debian 11 中仍然可以正常工作。 - JonathanDavidArndt根据 Spencer Rathbun 的回答,使用 bash:
true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
: &>/dev/null </dev/tcp/127.0.0.1/$PORT
。 - enstimeout 5s bash -c ': &>/dev/null </dev/tcp/127.0.0.1/${PORT}' && echo open || echo closed
- emilocalhost
或127.0.0.1
)发生的。 - emiconnect
,所以如果它被阻塞(例如防火墙),那么你确实需要一个超时。 - user1338062它们在/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上运行。
ss
命令没有返回反映其查找结果的退出代码;它总是返回0退出代码。 - John Greene| grep LISTEN
? - leucosState Recv-Q Send-Q Local Address:Port Peer Address:Port
,现在呢?这是什么意思? - Blacknc -l 8000
8000是端口号。如果端口空闲,它将启动一个服务器,你可以轻松关闭它。如果不空闲,则会抛出错误:
nc: Address already in use
netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'
[\\.\:]
。 - Patrick Oscity我想确认我们的一个Linux测试服务器上的端口是否开放。我可以通过尝试从我的开发机连接到测试服务器来实现这一点。在您的开发机上尝试运行以下命令:
$ telnet test2.host.com 8080
Trying 05.066.137.184...
Connected to test2.host.com
netstat -lnt
命令(带有-t
选项且不带-a
)将只显示正在监听的 TCP 连接。这可能会加快一些速度。如果您不需要 IPv6,可以添加-4
来仅显示 IPv4。 - Bartosz Moczulskinetstat -an | grep PORTNUMBER | grep -i listen
。 - automatixlsof
对你来说很慢,但通常它是你列出的解决方案中最好的。你的netstat
解决方案并不是非常可靠(每当你使用grep
时都可以猜测;无论如何,如果有人在4450上监听,它都会返回true)。telnet
和netcat
实际上尝试创建一个连接,这可能并不总是你想要的。 - petersohn