linux 测试本地端口是否打开,关于bash:有效测试Linux是否打开了端口?

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

我已经尝试了几种选择,但是我想要一些快速的方法:

1. lsof -i :445(以秒为单位)

2. netstat -an |grep 445 |grep LISTEN(以秒为单位)

3. telnet(它不返回)

4. nmap,netcat在服务器上不可用

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

netcat是否可用? 它具有快速失败路径IIRC。 netcat.sourceforge.net

netstat -lnt(带有-t和不带有-a)将输出限制为仅侦听TCP连接。 它可能会加快一点。 仅当不需要IPv6时,才能为IPv4添加-4。

lsof -i是个人喜好。

netstat -an | grep PORTNUMBER | grep -i listen如果输出为空,则未使用该端口。

我不知道为什么lsof对您来说很慢,但是通常它是您列出的最佳解决方案。 您的netstat解决方案不是很可靠(您每次使用grep时都可以猜到它;如果有人在听例如4450,无论如何它都会返回true)。 telnet和netcat实际上尝试创建一个连接,但不一定总是您想要的。

尝试在线工具以最快的方式移植详细信息-yougetsignal.com/tools/open-ports

我最近发现的一个惊喜是Bash本身支持tcp连接作为文件描述符。使用方法:

exec 6<>/dev/tcp/ip.addr.of.server/445

echo -e"GET / HTTP/1.0

">&6

cat

我使用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

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

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

这只是挂在我身上。

@AmanJain猫等待EOF或Ctrl-C退出。您需要针对您的协议进行调整。顺便说一句,您正在将此运行到远程服务器吗?

我想将端口检查代码嵌入服务器上/etc/init.d/下的脚本中

@AmanJain Ive已将其更新为本地系统。您只是想检查其收听是否正确?没有协议检查,例如通过http请求页面?

如果使用了端口,则不返回任何内容,是否有任何方法可以使它说"端口由占用"或smth

@Nik如果将&&添加到第一行,则可以打印出该端口处于活动状态,但是从本质上来说,该命令并不知道谁拥有该端口。

@Spencer我想您可以为此运行lsof -i或smth ... thnx!

基于此为bash添加了一个简单的oneliner。

这有一个缺点:当目标数据包被丢弃时,抛出错误需要很长时间。例如,如果您的IP位于另一个子网中,并且gw或防火墙丢弃了传出数据包。

请注意,端口12用于当前脚本,因此也不安全。

这不是一种可靠的方法,因为并非所有操作系统(例如,我今天发现的ubuntu 16)都附带了为构建devtcpIPPORT树而编译的bash

此处的"快速解答"非常简短:如何测试是否从Shell脚本打开了远程TCP端口?

$nc -z ; echo $?

我使用127.0.0.1作为"远程"地址。

谢谢,这似乎是最简单的方法。尽管示例脚本链接不再起作用,但是无论如何它都是不言自明的。

真好!这比打开许多端口的服务器上的其他答案要快得多。对于我来说,返回时间不到0.01秒,而netstat / lsof需要1s +

-z标志在基于Nmap的ncat(最新发行版附带)中不可用:Fedora,Centos等(nmap-ncat-6.01-9.fc18.x86_64)

与直觉相反,如果端口打开则返回" 0",如果端口关闭则返回" 1"。

@Sean Unix命令通常返回0表示成功,返回非零表示失败。因此,0表示成功连接,非零表示由于某种原因未连接。但是请注意,某些版本的nc不支持-z参数,因此stackoverflow.com/a/25793128/6773916可以说是一个更好的解决方案。

您可以通过这种方式使用netstat以获得更快的结果:

在Linux上:

netstat -lnt | awk '$6 =="LISTEN" && $4 ~ /\.445$/'

在Mac上:

netstat -anp tcp | awk '$6 =="LISTEN" && $4 ~ /\.445$/'

这将输出在端口上侦听的进程的列表(在此示例中为445),如果端口空闲则不输出任何内容。

您的netstat语法不正确。 netstat -ln --tcp有效,但是仍然很慢

实际上,这是正确的语法,但是可能您使用Linux,而我使用的是Mac。对于Linux,使用以下命令:netstat -lnt | awk $6 =="LISTEN" && $4 ~".445"

这什么也没输出。

@Hermione:您尝试过的命令是什么,在什么操作系统上?

视窗。我在上面的命令php -S localhost:32中尝试了32

不能说任何有关Windows的信息。该答案适用于Unix,Linux,Mac等。在Windows上,您可以安装cygwin以获得相同的行为。

问题是关于linux的,所以也许答案中应该有注释。

为了检查端口80,我需要使用awk $6 =="LISTEN" && $4 ~"80$"。我没有使用\.80检查端口号之前的点,而是使用了80$。否则,这也匹配包含.80的IP地址和以80开头的端口,例如8000。

@PatrickOscity:很好,但是要使其健壮,您需要将两种方法结合起来:awk $6 =="LISTEN" && $4 ~"\.80$"

@ mklement0为什么要在端口之前检查显式点(。)(当netstat在端口之前输出颜色时)?

@帕特里克:我想你是说冒号(:)。 Mac netstat实现实际上使用.(点)来附加端口号(奇怪的是),但是在Linux上,您确实需要:,如您所言。

您可以为此使用netcat。

nc ip port < /dev/null

连接到服务器并直接再次关闭连接。如果netcat无法连接,它将返回非零的退出代码。退出代码存储在变量$?中。举个例子,

nc ip port < /dev/null; echo $?

仅当netcat可以成功连接到端口时,才会返回0。

这个答案需要更多的投票。 nc非常适合这种情况。 / dev / tcp技巧很聪明,但是似乎很难实现带有信号中断的脚本。

nc为此具有-z标志,不需要从devnull输入。使用上面的-z标志已经有了答案。

@AbeVoelker感谢您指出这些相同的地方!

@AbeVoelker并非所有版本的nc都支持-z标志。我在CentOS 7上,发现Tonys解决方案是我所需要的。

@Shadoninja很高兴知道!如果我可以从2014年的评论中删除浮躁的话,我会的。

nc不再支持-z,因此此答案似乎是最好的解决方案。

它们在/ 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等分开,作为温柔的读者的练习...

基于Spencer Rathbun的答案,使用bash:

true &>/dev/null

好,它将抑制"拒绝连接"消息。如果服务接受连接而无需永远等待,则自动退出。

ss -tl4 '( sport = :22 )'

2ms够快吗?

添加冒号,这在Linux上有效

很好,ss比nc更快。 l用于侦听,4用于IPv4; sport代表(当然)源端口。上面的命令假设使用侦听TCP端口(t选项):对于UDP使用u选项,或者对于两种协议都不使用。与ss一样,更多信息如常在Nixcraft上。注意:ss过滤arent在这里工作,不知道为什么(bash 4.3.11,ss实用程序,iproute2-ss131122)必须与grep一起使用。

太遗憾的是,ss命令没有返回反映其发现的退出代码。它总是返回0退出代码。

| grep LISTEN?

这是一种适用于Mac和Linux的产品:

netstat -aln | awk '$6 =="LISTEN" && $4 ~"[\\.\:]445$"'

我认为您可以安全地删除[\\.\:]。

我想检查是否在我们的Linux测试服务器之一上打开了端口。

通过尝试将telnet从我的开发机连接到测试服务器,我能够做到这一点。在您的开发机上尝试运行:

$ telnet test2.host.com 8080

Trying 05.066.137.184...

Connected to test2.host.com

在此示例中,我要检查主机test2.host.com上的8080端口是否打开

nc -l 8000

其中8000是端口号。如果端口空闲,它将启动您可以轻松关闭的服务器。如果不是,它将抛出错误:

nc: Address already in use

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.

当Spencers解决方案不需要额外安装时,不确定tcping是否值得安装,但这是最干净,最易理解的解决方案。

您也可以使用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

只是列出了iptables规则...可能与打开的端口没有关联。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值