我正在尝试创建一个简单的 bash 脚本,可以使用 nmap -p 在多个 IP 和端口上运行“特定”端口扫描。我遇到的问题是,当它从 .txt 文件中读取端口号后跟 IP 时,文本文件在端口和 IP 之间有必要的空格,但这会导致脚本失败。我的代码如下。我试图使这个简单,我能想到的唯一的另一件事是创建一个数组,但即使如此,我认为 nmap -p 端口扫描的格式也会有同样的问题。有什么建议么?
for i in $(cat 'filepathway')
do
nmap -p $i
done
它执行这个:nmap -p 'port#'
而不是这样:nmap -p '端口#' 'IP#'
.txt 看起来像这样:(这些值是随机的)
23001 172.55.545.254
23002 172.55.545.254
...
答案1
for i in $(cat file); ...
不会逐行读取文件,而是逐字读取。
您可以使用while read ...
:
while read port ip; do
nmap -p "$port" "$ip"
done < "file"
答案2
您的问题是循环从 的拆分扩展中单独读取每个单词$(cat filepathway)
。这可以是端口号、IP 地址、另一个端口号等。您通常应该避免循环扩展命令替换,因为它的内存效率低下,容易出现您遇到的错误类型和其他错误,并且不允许循环开始执行,直到命令的完整结果读入内存。
如果不是端口号,您可以nmap
使用以下命令读取 IP 地址列表-iL
:
nmap -iL addr.list
...或者可能,如果您想覆盖特定范围的端口,
nmap -p 23000-23100 -iL addr.list
现在,您可以做的就是xargs
像这样使用:
xargs -L 1 nmap -p <addr.list
这将读取每一行并执行给出的命令,nmap -p
后跟端口号和 IP 地址。
最常见的xargs
实现将允许您使用-P
带有数字选项参数的选项来运行许多并行调用(请参阅xargs
系统上的手册)。
如果您仍想使用循环,请确保从每一行单独读取端口号和 IP 地址(如pLumo 已显示):
while read -r port ip; do
nmap -p "$port" "$ip"
done <addr.list