我必须使用 netcat 来扫描主机和端口。主机位于主机文件中,端口位于端口文件中。我必须逐行读取每个文件,并使用 netcat 查看端口是否已启用、已禁用或无效,最后将此信息发送到名为 scan_report.txt 的文件中
netcatfunction()
{
local portfile=$2
local hostfile=$4
paste $2 $4 | while IFS="$(printf '\t')" read -r f1 f2
do
result1=$( nc -zvw1 $f2 $f1 | grep succeeded )
$( $result1 > scan_report.txt)
done
}
netcatfunction $2 $4
答案1
#!/bin/bash
testNet(){
nc -zw 1 $1 $2
if [ "$?" -eq "0" ]; then
echo "$1 was listening on $2"
echo "$2 was open on $1" >> scan_report.txt
else
echo "$1 was not listening on $2"
fi
}
for host in $(cat hostfile); do
for port in $(cat portfile); do
testNet $host $port &
done
done
sleep 2
cp scan_report.txt sorter
cat sorter | sort > scan_report.txt
rm sorter
解释:
“提升”的大部分工作都在函数内部,因此它只能与 并行运行&
。这将为测试中的每个主机和端口生成一个子进程,而不会让您等待命令中每一秒超时的总和nc
。在nc
命令执行期间,主脚本将继续执行。这不会对资源造成问题,因为由于超时,每个进程最多持续一秒钟。
至于发生了什么,首先它从主机文件中读取一个主机,然后从端口文件中读取每个端口。它将每个主机与每个端口组合起来,并将其传递给 testNet 函数,该函数执行命令nc
并通过检查状态输出变量来确定连接是否成功$?
,成功时返回“0”。其他任何结果都被解释为失败。>> 重定向器确保每个结果都附加到文件中,并且不会完全覆盖它。
最后,在脚本的末尾,将结果按字母顺序排序并发送回文件。
这假设主机是原始 IP 地址或 FQDN,而端口只是像“22”这样的数字。如果您想要测试某个范围内的每个端口而不必逐行列出它们,则可以用 替换,以for port in $(cat portsfile); do
测试for((i=1;i!=20;i++)); do
从 1 到 19 的每个端口(将 20 替换为所需的最大值,将 1 替换为所需的最小值)。