使用bash生成随机IP地址问题

4

我有一个URL列表,想用它来构建防火墙日志。 例如:

$ cat urls.csv 

a.com

我知道如何使用IP直接作为变量构建日志。
$ cat processor.sh 

#!/bin/bash
filename="$1"
while read -r line
do
   URLS="$line"
   IP='10.109.1.1'
   today_date=`date +%d/%b/%Y`
   conact_1=" - - ["
   concat_2=":00:00:00 +0000] "
   date_concat=$conact_1$today_date$concat_2
   GET='"GET '
   protocol=' HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0'
   final_url=$IP$conact_1$today_date$concat_2$GET$URLS$protocol
   echo $final_url
done < "$filename"

结果:

$ bash processor.sh urls.csv

10.109.1.1 - - [22/Jul/2018:00:00:00 +0000] "GET a.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0 

现在如果我有一个包含50或100甚至更多的日志行,我该如何为所有网址生成随机IP并生成日志行?

$cat urls.csv

a.com
b.com
c.com
d.com
....

有没有关于如何在Bash中生成随机IP的建议?
期望结果:
$ bash processor.sh urls.csv

1.1.1.1 - - [22/Jul/2018:00:00:00 +0000] "GET a.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0
1.1.1.2 - - [22/Jul/2018:00:00:00 +0000] "GET b.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0
1.1.1.3 - - [22/Jul/2018:00:00:00 +0000] "GET c.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0
1.1.1.4 - - [22/Jul/2018:00:00:00 +0000] "GET d.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0
............

1
date_concat=$(date +" - - [%d/%b/%Y:00:00:00 +0000] ");格式字符串不受特殊转义字符的限制。 - chepner
2个回答

11

对于IPv4来说,基础知识如下:

printf "%d.%d.%d.%d\n" "$((RANDOM % 256))" "$((RANDOM % 256))" "$((RANDOM % 256))" "$((RANDOM % 256))"

你可能想要过滤掉192.168.0.0/1610.0.0.0/8以及许多其他地址。对于IPv6,您可以尝试:

for ((i=0;i<8;i++)); do printf "%02x%02x:" $((RANDOM%256)) $((RANDOM%256)); done | sed 's/:$//'  

($RANDOM 只生成小于 2^15-1 的值,所以使用 $((RANDOM%65536)) 是无意义的)


3
也许需要执行以下命令:printf "%d.%d.%d.%d\n" "$((RANDOM % 256 ))" "$((RANDOM % 256 ))" "$((RANDOM % 256 ))" "$((RANDOM % 256 ))",该命令会生成一个随机的 IP 地址。 - Inder

2

根据Inder的回答,这个功能按预期工作。

$cat processor.sh

#!/bin/bash
filename="$1"
while read -r line
do
   URLS="$line"
   #IP=$(printf "%d.%d.%d.%d\n" "$((RANDOM % 256 ))")
   IP=$(printf "%d.%d.%d.%d\n" "$((RANDOM % 256 ))" "$((RANDOM % 256 ))" "$((RANDOM % 256 ))" "$((RANDOM % 256 ))")
   #IP='10.109.1.1'
   today_date=`date +%d/%b/%Y`
   conact_1=" - - ["
   concat_2=":00:00:00 +0000] "
   date_concat=$conact_1$today_date$concat_2
   GET='"GET '
   protocol=' HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0'
   final_url=$IP$conact_1$today_date$concat_2$GET$URLS$protocol
   echo $final_url
done < "$filename"

$ bash processor.sh input.csv
103.137.94.111 - - [22/Jul/2018:00:00:00 +0000] "GET a.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0
74.123.232.234 - - [22/Jul/2018:00:00:00 +0000] "GET b.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0
102.13.8.154 - - [22/Jul/2018:00:00:00 +0000] "GET c.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0
210.106.160.230 - - [22/Jul/2018:00:00:00 +0000] "GET d.com HTTP/1.1" 304 0 304 0 0 0 655 456 645 368 0

1
我刚刚做了一个小修正,这仍然是威廉的答案和功劳 :) - Inder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接