我正在尝试编写一个bash
脚本来获取服务器上的所有IP地址。 脚本应该适用于所有主要的发行版。 这是我有什么:
ifconfig | grep 'inet addr:' | awk {'print $2'}
导致:
addr:10.1.2.3 addr:50.1.2.3 addr:127.0.0.1
我怎样才能首先删除addr:
前缀? 其次,我如何排除127.0.0.1
?
没有必要grep
。 这里有一个使用awk
:
仅列出addr:
ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }'
列表设备和地址:
ifconfig | awk -v RS="\n\n" '{ for (i=1; i<=NF; i++) if ($i == "inet" && $(i+1) ~ /^addr:/) address = substr($(i+1), 6); if (address != "127.0.0.1") printf "%s\t%s\n", $1, address }'
ifconfig
被ip
过时了。 它也有写输出易于解析的标志。 使用ip -4
仅显示IPV4地址。 请注意更简单的脚本,它已经排除了回送地址:
ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {print $2" "$4}'
或者如果你不想要网络:
ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {gsub("/", " "); print $2" "$4}'
只需使用hostname
,就可以使用-I
标志来获取所有IP地址的列表。
即
$ hostname --all-ip-addresses || hostname -I 10.10.85.100 10.20.85.100 10.30.85.100
而
$ hostname --ip-address || hostname -i ::1%1 127.0.0.1
Centos7(k3.10.0)
这是一个类似的脚本,我已经测试了一个ip地址范围,但是它很慢 – 有人可能会提示,如何加速这个? (这里的IP范围就是一个例子,让所有的线路,似乎在温哥华和韩国之间):
#!/斌/庆典
ip:{209..210}。{125..206}。{5..231}。{65..72}#209.126.230.71到210.205.6.66之间的ip
做
printf'===%s === \ n'“$ ip”
whois“$ ip”>> /home/$user/test001.txt
DONE
如果这太微不足道了或者在这里有一些错误,只需回答或评论。
这个脚本会持续5到8个小时。
这只是几个以前的答案和评论的升华。 样本输出包括在内。
要列出IP:
使用ip
:
(限于IPv4和全球)
$ /sbin/ip -4 -o addr show scope global | awk '{gsub(/\/.*/,"",$4); print $4}' 192.168.82.134 138.225.11.92 138.225.11.2
使用ifconfig
:
(不包括127.0.0.1)
$ /sbin/ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }' 192.168.82.134 138.225.11.92 138.225.11.2
要将IP映射到主机名,请参阅此答案 。
使用grep -v忽略127.0.0.1
ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1'
使用sed来编辑'addr:'
ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1' | sed -e 's/addr://'
ifconfig | grep 'inet addr:' | awk {'print $2'} | awk 'BEGIN{FS=":"}{print $2}' | grep -v '127.0.0.1'
如果它只是你想删除的“addr:”这个词,我会用sed
而不是awk
ifconfig | grep 'inet addr:' | awk {'print $2'}| grep -v 127.0.0.1 | sed -e 's/addr://'
这是一个非常棘手的解决方案,但它的工作原理:
ip a | awk ' !/[0-9]+\: lo/ && /^[0-9]\:/ || /inet / && !/127\.0\.0\.1/ {print $2}'
输出:
eth0: 192.168.0.1/24
更好的是:
ip a | awk ' !/[0-9]+\: lo/ && /^[0-9]\:/ || /inet / && !/127\.0\.0\.1/ {print $2}' | perl -i -pe "s/:\n/: /g;" -pe "s/\/[\d]+$//"
输出:
eth0: 192.168.0.1
我没有一个机器有几个非回送接口,我可以检查它,随时张贴您的发现。
我总是很惊讶地看到人们使用sed和awk而不是perl。
但是,首先,使用grep和awk和一个额外的选项,随意只是:
ifconfig | grep 'inet addr:' | awk {'print $2'} | awk -F: {'print $2'} | grep -v '127.0.0.1'
用perl替换awk:
ifconfig | grep 'inet addr:' | perl -F\\s\|: -ane 'print "$F[2]\n"' | grep -v '127.0.0.1'
替换相同的Perl脚本中的greps:
ifconfig | perl -F\\s\|: -ane 'next if !/^inet addr:/ or /127\.0\.0\.1/; print "$F[2]\n"'
最后只是使用Perl的正则表达式的力量:
ifconfig | perl -ne 'next if !/inet addr:(?<ip>[0-9.]+)/ or $+{ip} == "127.0.0.1"; print "$+{ip}\n"'
我会向你介绍一个叫做OSQuery的命令行工具,它可以帮助你通过类似于SQL的查询来获得系统信息。 比如你的情况,你可以进入;
osquery> select * from interface_addresses;
哪个会输出类似的东西;
interface = wlan0 address = 192.168.0.101 mask = 255.255.255.0 broadcast = 192.168.0.255 point_to_point =
我发现更多的整洁和方便。
ifconfig | grep 'inet addr:' | awk {'print $2'} | cut -d ":" -f 2