尝试将IP地址范围打印到文件中。而不是遍历该范围,它仅打印包含变量值的一行。
cidr="192.168.0.1/24"
# range is bounded by network (-n) & broadcast (-b) addresses.
lo=$(ipcalc -n $cidr |cut -f2 -d=)
hi=$(ipcalc -b $cidr |cut -f2 -d=)
read a b c d <<< $(echo $lo |tr . ' ')
# echo $a.$b.$c.$d
read e f g h <<< $(echo $hi |tr . ' ')
# echo $e.$f.$g.$h
for ip in {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h};
do
echo $ip > results.txt
done;
当前输出为...
{192..192}.{168..168}.{0..0}.{0..255}
如果给定192.168.0.1/24
,则寻找如何获取输出以在文件的每一行上打印该网络中的每个主机...
192.168.0.0
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
...
192.168.0.255
答案 0 :(得分:1)
这种seq
和xargs
的用法看起来很有趣:
seq 192 192 |
xargs -i seq -f "{}.%.0f" 168 168 |
xargs -i seq -f "{}.%.0f" 0 0 |
xargs -i seq -f "{}.%.0f" 0 255
因此在您的脚本中应该是:
seq $a $e |
xargs -i seq -f "{}.%.0f" $b $f |
xargs -i seq -f "{}.%.0f" $c $g |
xargs -i seq -f "{}.%.0f" $d $h |
while read ip; do
...
done
或者您可以for ip in $(seq $a $e | .... ); do
,但是那样不那么酷。
有什么好处,很容易使其成为函数。
答案 1 :(得分:0)
这有效...它使用eval
而不是循环将所有ip地址写入文件,然后按空格将其拆分,并用换行符将该空格替换为另一个文件。
cidr=$1
# range is bounded by network (-n) & broadcast (-b) addresses.
lo=$(ipcalc -n $cidr |cut -f2 -d=)
hi=$(ipcalc -b $cidr |cut -f2 -d=)
read a b c d <<< $(echo $lo |tr . ' ')
echo $a.$b.$c.$d
read e f g h <<< $(echo $hi |tr . ' ')
echo $e.$f.$g.$h
eval "echo {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}" > ip_range.txt
tr ' ' '\n' < ip_range.txt > results.txt
您也可以改为执行此操作,并一次性编辑间距...
cidr=$1
# range is bounded by network (-n) & broadcast (-b) addresses.
lo=$(ipcalc -n $cidr |cut -f2 -d=)
hi=$(ipcalc -b $cidr |cut -f2 -d=)
read a b c d <<< $(echo $lo |tr . ' ')
echo $a.$b.$c.$d
read e f g h <<< $(echo $hi |tr . ' ')
echo $e.$f.$g.$h
eval "printf '%s\n' {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}" > ip_range.txt