![bash 脚本,使用 bash 内置的 /dev/tcp 检查端口响应,时间延迟 |挂起|加速](https://linux22.com/image/202979/bash%20%E8%84%9A%E6%9C%AC%EF%BC%8C%E4%BD%BF%E7%94%A8%20bash%20%E5%86%85%E7%BD%AE%E7%9A%84%20%2Fdev%2Ftcp%20%E6%A3%80%E6%9F%A5%E7%AB%AF%E5%8F%A3%E5%93%8D%E5%BA%94%EF%BC%8C%E6%97%B6%E9%97%B4%E5%BB%B6%E8%BF%9F%20%7C%E6%8C%82%E8%B5%B7%7C%E5%8A%A0%E9%80%9F.png)
使用此脚本,我检查主机是否在给定端口上响应bash 的内置 /dev/tcp。
我可以使用 IP 地址或域(主机名)。
脚本1
#!/bin/bash
HOST_NAME="127.1"
HOST_PORT="80"
if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
echo -e "PORT: ${HOST_PORT} | ON"
else
echo -e "PORT: ${HOST_PORT} | OFF"
fi
exit;
脚本2
#!/bin/bash
HOST_NAME="127.1"
for HOST_PORT in {1..1000}
do
if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
echo -e "PORT: ${HOST_PORT} | ON"
else
echo -e "PORT: ${HOST_PORT} | OFF"
fi
done
exit;
脚本3
#!/bin/bash
HOST_NAME="127.1"
declare -A PORT_ON
for HOST_PORT in {1..65535}
do
if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
PORT_ON[${HOST_PORT}]="ON"
fi
done
for i in ${!PORT_ON[*]}
do
echo -e "$i : ${PORT_ON[$i]}"
done
exit;
在我们的一些本地和在线域上脚本3挂在某些端口上,并且需要更长的时间才能跳转到下一个端口扫描,例如在 ssh 上(由于防火墙或其他服务)。我该如何管理它,它会立即继续,是否可以加快脚本速度,当我扫描所有 65535 端口时,它需要很长时间。
我的 GNU/Linux 发行版:
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
4.19.0-16-amd64
我的/etc/apt/sources.list
deb http://security.debian.org/debian-security buster/updates main contrib
deb-src http://security.debian.org/debian-security buster/updates main contrib
deb http://deb.debian.org/debian/ buster-updates main contrib
deb-src http://deb.debian.org/debian/ buster-updates main contrib
我只能从这个存储库安装。
bash 脚本,使用 bash 内置的 /dev/tcp 检查端口响应,时间延迟 |挂起|加速
如何加快和终止时间延迟?
答案1
运行这个timeout
。
我放置了一个计时器变量来检查运行时间。
看来你不能比0.01
.
如果使用 执行此脚本0.001
,您将只能看到计时器变量的结果,而看不到其他结果。
即使使用1
,0.1
或0.01
, 你也总是会得到相同的结果。
我用 Ubuntu 22.04 测试了这个脚本并将端口设置为 10000。
#!/bin/bash
starttime=$(date +%s)
HOST_NAME="127.0.0.1"
declare -A PORT_ON
for HOST_PORT in {1..10000}
do
if((timeout 0.1 bash -c "</dev/tcp/${HOST_NAME}/${HOST_PORT}") 2> /dev/null); then
PORT_ON[${HOST_PORT}]="ON";
fi
done
for i in ${!PORT_ON[*]}
do
echo -e "$i: ${PORT_ON[$i]}"
done
endtime=$(date +%s)
echo "runtime: $(($endtime - $starttime))"