• 此脚本的初衷是因为,KVM创建的桥接网卡的虚拟机,无法使用virsh domifaddr命令获取IP,而创建的nat网卡的虚拟机,则可以直接使用virsh domifaddr命令来获取IP
  • 此脚本是个人学习所写的,关于KVM的管理方式,有很多,可以直接使用virt-manager图形化管理配置KVM虚拟机
  • 本着传统手艺不能丢的原则,写下了此脚本,和大佬们互相学习
  • 此脚本最终生成的log文件,也可以当成是资产管理清单
  • 只要路子野,shell也很强

脚本说明

  • 执行脚本之前,需要修改脚本内的IP_HEAD变量,改成自己IP网段,只需要前三个主机位即可,结尾不要有.,否则后面内容执行会报错
  • 脚本使用方法:
    • sh 脚本名称 KVM虚拟机名称(例如:sh virsh-ip.sh centos8.3.3)(虚拟机名称可以使用virsh list命令获取)
    • sh 脚本名称 all(例如:sh virsh-ip.sh all)(获取所有KVM虚拟机的IP)
  • 此脚本获取IP的方式:通过ping整个网段的所有IP,从1ping到255,创建arp缓存表,通过过滤mac地址来获取IP
  • 此脚本开启了并发,可以适当减少ping的范围,减少脚本的运行时间,修改PING_ALL_IPADDR函数内的seq命令参数即可()
  • 此脚本会用到arp命令,需要安装net-tools,否则会获取不到IP,并且会报错
  • 此脚本最终会将内容追加到脚本所在目录的virsh-ip.log文件内,脚本完成后,会有如下回显:Get IP complate,Use command: cat /root/virsh-ip.log,直接复制cat命令和参数,执行后,即可查看到虚拟机对应的IP地址

脚本展示

#!/bin/bash
BASE_DIR=$(cd $(dirname $0); pwd)
VIRSH_NAME=$1
IP_HEAD=192.168.72 if [ "$1"x == "all"x ]
then
VIRSH_NAME=$(virsh list | egrep -v "^$|Name|-----" | awk '{print $2}')
else
VIRSH_NAME=$1
fi function PING_ALL_IPADDR () {
for i in $(seq 1 255)
do
{
ping ${IP_HEAD}.${i} -c 1 -w 1 > /dev/null 2>&1
} &
done
wait
} function FIND_VIRSH () {
VIRSH_NAME_ARRAY=($(printf "%q\n" ${VIRSH_NAME})) for (( n=0 ; n<${#VIRSH_NAME_ARRAY[@]} ; n++ ))
do
VIRSH_MAC=$(virsh domiflist ${VIRSH_NAME_ARRAY[n]} | egrep -v "MAC|-----|^$" | awk '{print $NF}')
echo "${VIRSH_NAME_ARRAY[n]}:" >> ${BASE_DIR}/virsh-ip.log
arp -n | grep -i ${VIRSH_MAC} | awk '{print "ip:"$1 "\t" "mac:"$3}' >> ${BASE_DIR}/virsh-ip.log
echo " " >> ${BASE_DIR}/virsh-ip.log
done printf "\e[1;35m Get IP complate,Use command: cat ${BASE_DIR}/virsh-ip.log\e[0m\n"
} function main () {
printf "\e[1;35m I'm just coming!\e[0m\n"
PING_ALL_IPADDR
FIND_VIRSH
} main

效果展示

执行脚本,获取全部KVM虚拟机的IP

sh virsh-ip.sh all

脚本执行后的回显

 I'm just coming!

执行成功后的回显

 Get IP complate,Use command: cat /root/virsh-ip.log

查看日志内容

cat /root/virsh-ip.log
centos8.3.3-ks:
ip:192.168.72.85 mac:52:54:00:d1:34:fb centos8.3.1-ks:
ip:192.168.72.87 mac:52:54:00:87:bf:a9 centos8.3.2-ks:
ip:192.168.72.86 mac:52:54:00:f5:3c:c0

大家如果有建议,可以评论告诉我,或者私信我,我可以修改脚本,让他变得更好

看我如何使用 shell 来获取所有 KVM 虚拟机的 IP 地址的更多相关文章

  1. 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  2. js获取本机的网络IP地址

    JavaScript是一门脚本语言,是不能操作文件,读取本地信息的,所以想要获取IP,还需要借助后端技术.方法如下: //获取本机的网络ip地址 function jsonpCallback(res) ...

  3. 如何获取 docker 容器(container)的 ip 地址

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

  4. 如何获取 docker 容器(container)的 ip 地址(转)

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

  5. Java获取请求客户端的真实IP地址

    整理网友的材料,最后有源码,亲测能解决所有java获取IP真实地址的问题 整理的这里: 1.链接1 2.链接2 JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr() ...

  6. HttpServletRequest -- 获取请求主机真实的IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了 Apache,Nagix等反向代理软件就不能获取到客户端的真实 ...

  7. 014-docker-终端获取 docker 容器(container)的 ip 地址

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

  8. java 获取的是本地的IP地址

    1 public static void main(String[] args) { 2 try { 3 InetAddress address = InetAddress.getLocalHost( ...

  9. Java Web项目获取客户端和服务器的IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

随机推荐

  1. 第10组 Alpha冲刺 (5/6)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13996848.html ·作业博客:https://edu.cnblogs.co ...

  2. vue2.0多页面开发

    我们平常用vue开发的时候总觉得vue好像就是专门为了单页面应用而诞生的,其实不是.因为vue在工程化开发的时候很依赖webpack,而webpack是将所有的资源整合到一块,弄成一个单页面.但是vu ...

  3. 基本的sql语法

    1. SELECT: 用于从数据库中选取数据 SELECT name,value FROM table_name 2.SELECT DISTINCT 语句用于返回唯一不同的值(去重) 3.WHERE ...

  4. day 20 C语言顺序结构基础3

    (1).若有定义:int a=100:则语句printf("%d%d%d\n",sizeof("a"),sizeof(a),sizeof(3.14)); 则输出 ...

  5. 开源数据可视化BI工具SuperSet(使用)

    上一篇介绍了Linux 下如何安装SuperSet ,本篇简单介绍一下如何使用 1.输入安装时设置的用户名密码登录控制台  2.控制界面如下  3.第一步添加数据源(已安装好的mysql) 点击 da ...

  6. 使用Rainbond打包业务模块,实现业务积木式拼装

    背景 每个程序员在学习开发的过程中,都知道解耦和模块化的重要性,也希望自己设计和开发的程序支持模块化,开发好的模块其他人就能快速复用,为了达成这个效果,我们学习各种模块化和解耦的技术,从面向对象的设计 ...

  7. Sentry 开发者贡献指南 - 数据库迁移

    Django 迁移是我们处理 Sentry 中数据库更改的方式. Django 迁移官方文档:https://docs.djangoproject.com/en/2.2/topics/migratio ...

  8. JavaScript输出的两种方式

    var a="Hello World" document.write(a) //在网页上输出:Hello World var a="Hello World" c ...

  9. gin初识

    Gin 是一个用 Go (Golang) 编写的 web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍. 如果你是性能和 ...

  10. 关于new Date总结及注意事项

    记录关于 new Date() 的一些常用方法及问题 new Date()基本方法: 创建一个日期对象的几种方法 注意: 由于浏览器差异和不一致性,强烈建议不要使用Date构造函数(和Date.par ...