从bash脚本中,如何快速查明端口 445 是否在服务器上打开/侦听 .
445
我尝试了几种选择,但我想要一些快速的东西:
lsof -i :445
netstat -an |grep 445 |grep LISTEN
telnet
nmap
netcat
知道一种不首先枚举的方法和之后的greps会很高兴 .
我最近发现的一个惊喜是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 . 5有时被Bash for child processes使用,所以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
要确定某人是否正在侦听,请尝试通过环回进行连接 . 如果失败,则关闭端口或不允许访问 . 然后,关闭连接 .
根据您的使用情况对此进行修改,例如发送电子邮件,在失败时退出脚本或启动所需服务 .
这里有一个很短的"fast answer":How to test if remote TCP port is opened from Shell script?
$ nc -z <host> <port>; echo $?
我用127.0.0.1作为“远程”地址 .
您可以通过这种方式使用netstat以获得更快的结果:
On Linux:
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
On 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 .
它们列在/ 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)
:50
请查看 man 5 proc 了解更多详情 . 并选择与sed等分开,留给温柔的读者练习......
man 5 proc
根据Spencer Rathbun的回答,使用bash:
true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
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到测试服务器来做到这一点 . 在你的dev机器上尝试运行:
$ telnet test2.host.com 8080 Trying 05.066.137.184... Connected to test2.host.com
在这个例子中,我想检查端口8080是否在主机test2.host.com上打开
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.
nmap 是正确的工具 . 只需使用 nmap example.com -p 80
nmap example.com -p 80
您可以从本地或远程服务器使用它 . 它还可以帮助您识别防火墙是否阻止访问 .
如果您正在使用iptables,请尝试:
iptables -nL
要么
iptables -nL | grep 445
13 回答
我最近发现的一个惊喜是Bash本身支持tcp connections as file descriptors . 使用:
我使用6作为文件描述符,因为0,1,2是stdin,stdout和stderr . 5有时被Bash for child processes使用,所以3,4,6,7,8和9应该是安全的 .
根据下面的注释,测试在脚本中侦听本地服务器:
要确定某人是否正在侦听,请尝试通过环回进行连接 . 如果失败,则关闭端口或不允许访问 . 然后,关闭连接 .
根据您的使用情况对此进行修改,例如发送电子邮件,在失败时退出脚本或启动所需服务 .
这里有一个很短的"fast answer":How to test if remote TCP port is opened from Shell script?
我用127.0.0.1作为“远程”地址 .
您可以通过这种方式使用netstat以获得更快的结果:
On Linux:
On Mac:
这将输出监听端口的进程列表(在此示例中为445),或者如果端口空闲则不输出任何内容 .
你可以使用netcat .
连接到服务器并再次直接关闭连接 . 如果netcat无法连接,则返回非零退出代码 . 退出代码存储在变量$?中 . 举个例子,
当且仅当netcat可以成功连接到端口时才会返回0 .
它们列在/ proc / net / tcp中 .
它是第二列,在“:”之后,以十六进制表示:
所以我想第三列中的其中一个
:50
必须是stackoverflow:o)请查看
man 5 proc
了解更多详情 . 并选择与sed等分开,留给温柔的读者练习......根据Spencer Rathbun的回答,使用bash:
2ms足够快?
添加冒号,这适用于Linux
这是适用于Mac和Linux的一个:
其中8000是端口号 . 如果端口是空闲的,它将启动一个可以轻松关闭的服务器 . 如果不是,则会抛出错误:
我想检查一个端口是否在我们的一个linux测试服务器上打开 . 我能够通过尝试从我的开发机器连接telnet到测试服务器来做到这一点 . 在你的dev机器上尝试运行:
在这个例子中,我想检查端口8080是否在主机test2.host.com上打开
tcping 是一个很好的工具,开销很低 . 它还有一个超时参数,使其更快:
nmap
是正确的工具 . 只需使用nmap example.com -p 80
您可以从本地或远程服务器使用它 . 它还可以帮助您识别防火墙是否阻止访问 .
如果您正在使用iptables,请尝试:
要么