歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Linux腳本程序自動修改網卡配置文件中的MAC地址

在玩Linux虛擬機的時候,一個安裝好linux系統的virtual HDD會用於創建多個虛擬機,這樣就不需要在創建每個虛擬機都安裝一遍系統了。virtual HDD加載到虛擬機後,新的虛擬機的MAC地址就會和virtual系統中ifcfg-eth[0-9]中的MAC地址不一樣,進入系統後,ifconfig -a看到的網卡編號是接著原來系統中網卡序號編號的。假如原來系統中有四塊網卡,那麼對應的編號是:eth0,eth1,eth2,eth3;那麼你用virtual HDD來創建一個新虛擬機,新的虛擬機同樣配置了四塊網卡,那麼在進入系統後,用ifconfig -a 應該看到以下這樣的網卡編號:eth4,eth5,eth6,eth7。

我經常會遇到這樣的問題,每次修復這類問題,都要花上很長時間,實在糾結。我不得不考慮自動化的問題。於是下面的這個腳本程序就誕生了。

這個腳本程序主要修改以下兩個文件:

 ifcfg-eth[0-9]:[0-9]是泛指,這是正則表達式的表示方法,別說看不懂。這些網卡配置文件中的MAC地址全部要修改為當前機器上網卡的MAC。

 70-persistent-net.rules:決定網卡的編號。這個文件中的內容,是系統啟動時檢測到的網卡,是系統自動生成;這個文件可以直接清空,我這裡為了練手,所以我也對其做了細化處理。

執行完這個腳本後,重啟系統,就一切OK了。就看到了熟悉的eth0,eth1……之類的了。

此腳本程序適應於RHEL系列,CentOS。

#!/bin/bash
#update:2012-12-16
#author:Sean_Gong
#version
#根據系統所識別到的網卡個數,決定修改ifcfg-eth$x文件,在修改這個網卡配置文件之前首先確定這個文件是否存在。
#如果存在,則把系統識別到的所有網卡的MAC地址寫入該文件作為注釋,便於記錄和檢查。
#在處理70-persistent-net.rules時,可以簡單的把該文件清空。
#系統重啟後,會自己把識別到的網卡添加到這個文件中,不需要人工干預。
#這裡我之所以處理這個文件,是為了練習sed對文本的處理,和程序邏輯的鍛煉,對程序整體的掌控能力。

cdate=$(date '+%Y%m%d')
 
num=$(ifconfig -a | grep eth | wc -l)
 
 
 
for ((n=0;n<${num};n++))
 
    do
 
      j=$((n+1))
 
      [ -e 70-persistent-net.rules_${cdate} ] || cp -fa /etc/udev/rules.d/70-persistent-net.rules 70-persistent-net.rules_${cdate}
 
 
 
      if [ -e /etc/sysconfig/network-scripts/ifcfg-eth${n} ] ; then
 
          [ -e ifcfg-eth${n}_${cdate} ] || cp -fa /etc/sysconfig/network-scripts/ifcfg-eth${n} ./ifcfg-eth${n}_${cdate}
 
          cat ifcfg-eth${n}_${cdate} | sed '/^#eth.*$/d' > ifcfg-eth${n}_temp
 
          ifconfig -a | grep "HWaddr" | awk '{print "#"$1" : "$5}' >> ifcfg-eth${n}_temp
 
          newmac=$(ifconfig -a | grep "eth" | sort | awk '{print $5}' | nl -n ln | grep "^${j}" | awk '{print $2}')
 
          sed "s/HWADDR.*$/HWADDR=$newmac/g" ifcfg-eth${n}_temp > ifcfg-eth${n}_vi
 
          cp -fa ifcfg-eth${n}_vi /etc/sysconfig/network-scripts/ifcfg-eth${n} && rm -f ifcfg-eth${n}_temp
 
          grep -i ${newmac} 70-persistent-net.rules_${cdate} | sed "s/NAME=.*$/NAME=\"eth${n}\"/g" >> 70-persistent-net.rules_temp
 
      else
 
          newmac=$(ifconfig -a | grep "eth" | sort | awk '{print $5}' | nl -n ln | grep "^${j}" | awk '{print $2}')
 
          grep -i ${newmac} 70-persistent-net.rules_${cdate} | sed "s/NAME=.*$/NAME=\"eth${n}\"/g" >> 70-persistent-net.rules_temp
 
          continue
 
      fi
 
    done
 
 
 
cat 70-persistent-net.rules_temp > 70-persistent-net.rules_vi && rm -f 70-persistent-net.rules_temp
 
cp -fa 70-persistent-net.rules_vi /etc/udev/rules.d/70-persistent-net.rules

 

Copyright © Linux教程網 All Rights Reserved