Порівняйте MAC-адресу живого мережевого інтерфейсу, використовуючи grep, з існуючими файлами конфігурації


1

Клонування віртуальних машин створює новий мережевий інтерфейс щоразу на VOS VentOS / RedHat. Мені потрібно перейменувати ifcfg-eth * на те саме ім'я, що і живий інтерфейс у VM.

Що я хотів би зробити, це використовувати скрипт для порівняння MAC-адреси живого NIC (взяти його з результату 'ifconfig') tp MAC-адреси у всіх існуючих файлах ifcfg- * та перейменувати відповідний на ifcfg-liveNICname.

Приклад:

# ifconfig
eth2      Link encap:Ethernet  HWaddr 00:50:56:8F:5B:D5

є 3 файли конфігурації в / etc / sysconfig / network-script / /:

ifcfg-eth0
ifcfg-Auto_eth0
ifcfg-eth1

скрипт порівнює MAC-адресу 00:50:56:8F:5B:D5з MAC-адресами у всіх 3-х файлах і перейменовує правильну (з відповідною MAC-адресою) на:

ifcfg-eth2

Переважно, він також може змінити рядок NAME у файлі ifcfg:

NAME=eth2

але не потрібно.

Мені потрібно це "виправлення", щоб я міг запустити скрипт на купі віртуальних машин, щоб змінити записи DNS за один раз. У мене є сценарій для цього, але коли він працює на тестовій VM, він створює новий файл ifcfg-eth2 із лише записами DNS в ньому, тоді як активний інтерфейс має інше ім'я у файлі, наприклад, ifcfg-eth0

Оскільки я не добрий у написанні сценаріїв, я почав з цього:

nic=$(/sbin/route -n | grep "^0.0.0.0" | rev | cut -d' ' -f1 | rev)
ifconfig -a | grep $nic`

і це все, що я отримав :(

Хто-небудь може допомогти, будь ласка?


Який гіпервізор ви використовуєте? VirtualBox, Xen, KVM, ...?
MariusMatutiae

Усі VM є у VMware.
Марк

Відповіді:


0

Якщо я вас правильно зрозумів, ви хочете отримати MAC-адресу NIC, що використовується зараз, а потім знайти файл, в /etc/sysconfig/network-scripts/якому згадується ця MAC-адреса, і перейменувати цей файл на місце, ifcfg-NICде NICраніше знайдено мережевий пристрій. Якщо це так, це має працювати:

#!/usr/bin/env bash

## Get the NIC's name
# nic=$(/sbin/route -n | awk '/^0\.0\.0\.0/{print $NF}')
nic=$(/sbin/ip route show | awk '/default/{print $5}')


## Get the NIC's MAC address
#mac=$(/sbin/ifconfig "$nic" | grep -oP 'HWaddr\s*\K[^\s]*')
mac=$(/sbin/ip link show "$nic" | grep -oP 'ether\s*\K[^\s]*')

## Get the file name. This assumes that there will only
## be one matching file. 
file=$(grep -lm 1 "$mac" /etc/sysconfig/network-scripts/*)

## Change the NAME line to the new NIC and make
## a backup copy of the file called "$file.bak".
sed -i.bak -r "s/NAME=(.*)/NAME=$nic/" "$file"

## Rename the file
mv "$file" "$(dirname "$file")"/ifcfg-"$nic"

route і ifconfig застаріли, були замінені набором команд iproute2 .
MariusMatutiae

Привіт Маріус. Цей сценарій чудовий, але мені довелося змінити wlan0 на $ nic, щоб отримати MAC-адресу живого NIC, оскільки я отримував помилку, що wlan0 не існує. Ці рядки: sed -i.bak -r "s / NAME = (. *) / NAME = $ nic /" "$ file" mv "$ file" "$ (dirname" $ ​​file ")" / ifcfg - "$ nic "дають мені результати: sed: не вдається прочитати: Немає такого файлу чи каталогу mv: не може stat` ": Немає такого файлу чи каталогу. Я мушу сказати, що ніколи не придумав би такий сценарій. Це чудова допомога. Дуже тобі дякую.
Mark

Маріусе, ти найкращий. Зараз сценарій спрацював чудово. Не впевнений, у чому проблема, але мені довелося трохи змінити сценарій. Найбільший спасибі Тобі
Марк

@ Марк, ласкаво просимо. Вибачте за те wlan0, що залишилося від мого тестування, але воно має працювати зараз. Якщо ця відповідь вирішить вашу проблему, будь ласка, знайдіть хвилину і поставте галочку під підрахунком голосів зліва, це означатиме для всіх, що ваша проблема була вирішена.
тердон

@terdon Дякую. Вибачте, що я подякував неправильне ім’я в попередніх відповідях.
Марк

0

Я не впевнений, що розумію, що ви хочете зробити.

Ви хочете змінити DNS-сервери? Вони розташовані у файлі /etc/resolv.conf, незалежно від імені NIC.

Ви хочете мати всіх клонів з однаковими MAC-адресами? Різні MAC адреси? вибрані вручну MAC адреси? Читайте далі.

Найпростіше - вручну призначити MAC-адреси ваших NIC для кожного (клонованого чи ні) VM.

Інструкції для цього в Інтернеті, див., Наприклад, тут . Відредагуйте .vmx файл VM, видаліть рядки, починаючи з

  ethernetN.generatedAddress
  ethernetN.addressType
  ethernetN.generatedAddressOffset 

і покласти на їх місце дві лінії

  ethernetN.address = "00:50:56:XX:YY:ZZ"
  ethernetN.addressType = “static”

де 00: 50: 56: XX: YY: ZZ - MAC-адреса, яку ви хочете ввести. Тепер збережіть файл і все закінчено.


Я все намагаюся досягти - перейменувати файл ifcfg- * для активного інтерфейсу, наприклад, eth2 на власне ім’я, яке для eth2 було б ifcfg-eth2, я намагаюся це зробити, запустивши сценарій через HPSA на купу ВМ. Що стосується зміни DNS, то потрібно змінити записи DNS у файлі ifcfg- * в RHEL6, оскільки резолюція.conf буде перезаписана після перезавантаження. Це не проблема в RHEL5
Марк

@ Марк Але чому? Запис DNS у ifconfig-ethN в будь-якому випадку копіюється в /etc/resolv.conf, див. Centos.org/docs/5/html/Deployment_Guide-en-US/… Ви можете також працювати над / etc / resolutionv .conf безпосередньо, менше клопоту
MariusMatutiae

В порядку. Давайте відступимо. Rhel5 не вимагає DNS-записів у файлі ifcfg- *, як ви вже говорили, це у резолюції.conf. У Rhel6 записи DNS зберігаються у файлі ifcfg- *, і якщо я зміню reslav.conf, він буде перезаписаний при перезавантаженні. У мене є робочий сценарій для цього. Моя проблема полягає в тому, що у клонованих віртуальних машинах файли ifcfg- * мають різні імена від активних NIC. Цей рядок: nic = $ (/ sbin / route -n | grep "^ 0.0.0.0" | rev | cut -d '' -f1 | rev) є частиною мого сценарію зміни DNS, тому DNS змінюється на ім'я файлу заснований на живому імені NIC. Оскільки файли мають різні назви, скрипт створює новий файл (це погано)
Марк

Як я вже говорив, я не дуже хороший у написанні сценаріїв. Я тільки навчився «повзати». Я впевнений, що можна отримати скрипт, який зможе змінити ім'я правильного файлу ifcfg- * (для прямого NIC)
Позначити
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.