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