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