MAC hostid lekérdezése - optimalizálás

Fórumok

Tisztán csak azért, mert néha igazán jó ötleteket lehet kapni: hogy lehetne ezt jobban csinálni?

tr -d : < /sys/class/net/$(nmcli con show| awk '/ethernet/ {print $1}')/address 

Feltételezem, hogy csak egy ethernet interfész van (licencszerver, szóval ha több lenne, azzal csak magunkkal tolnánk ki), ezért ezzel a résszel nem kell foglalkozni.

A feladat az az, hogy Red Hat - mégpedig 9 - környezetben ki kell kotorni az interfész MAC címét, és kivenni belőle a kettőspontokat (kötőjeleket). A kisbetű->nagybetű átalakítás elvileg nem kell.

A fenti példa működik, nekem meg haladnom kell a melóval, viszont hátha van elegánsabb megoldás is. Mivel RedHat, ezért az nmcli viszonylag adott, de a hordozhatóság jegyében bármi használható.

Örömmel veszem az ötleteket azoktól, akiknek van kedve és ideje ezzel foglalkozni :)

Hozzászólások

A robot aszondja, hogy:

 

Az általad megosztott parancs működik, de van néhány lehetőség, hogy egyszerűbbé és olvashatóbbá tedd a megoldást. Az nmcli parancs és a MAC-cím manipulálása többféleképpen is megoldható. Íme néhány javaslat, amelyeket érdemes megfontolni:

  1. Az általad megosztott parancs működik, de van néhány lehetőség, hogy egyszerűbbé és olvashatóbbá tedd a megoldást. Az `nmcli` parancs és a MAC-cím manipulálása többféleképpen is megoldható. Íme néhány javaslat, amelyeket érdemes megfontolni:

    1. **Egyszerűbb parancs szerkezet:**
       Lehetőség van arra, hogy az `awk` használatát elkerüljük és egy kicsit optimalizáljuk a parancsot. Az `nmcli` segítségével közvetlenül hozzáférhetünk az interfész adataihoz, így nem szükséges az `/sys/class/net/.../address` fájlra hivatkozni.

    2. **Példa egyszerűbb parancsra:**
       Ha az `nmcli`-t használjuk, a MAC-címet közvetlenül lekérhetjük:

       ```
       nmcli -g GENERAL.HWADDR device show $(nmcli -g DEVICE,TYPE connection show --active | awk -F: '/ethernet/ {print $1}') | tr -d :
       ```

       **Magyarázat:**
       - `nmcli -g GENERAL.HWADDR device show` segítségével közvetlenül kérdezhetjük le az aktív Ethernet interfész MAC-címét.
       - A `nmcli -g DEVICE,TYPE connection show --active` parancs lekéri az aktív kapcsolatok listáját, és az Ethernet típusú eszköz nevét választjuk ki.
       - Végül a `tr -d :` törli a kettőspontokat a MAC-címből.

    3. **Hordozhatóság növelése:**
       Az `nmcli` eszköz egy Red Hat-specifikus megoldás, de ha hordozhatóbb megoldást szeretnél, használhatsz más parancsokat, mint például az `ip` vagy `ifconfig`. Azonban az `nmcli` biztosítja a legegyszerűbb és legszabványosabb hozzáférést az interfész adataihoz Red Hat környezetben.

    Ez a megoldás egy kicsit olvashatóbb és jobban használja az `nmcli` beépített lehetőségeit.

1904.04.08.
RIP Jákub.
neut @

Ezt nehogy említsed így, hogy az AI szar. Vannak erre fanboyok, akik ezen meg fognak sértődni.

Egyébként szerintem nem nagyon lehet sokkal elegánsabban csinálni, mint ami a topikindítóban van. Alapvetően /sys/-ből kell kimókolni, és valami interfacelistából grep-pel vagy awk-kel leszűkítve a szükséges azonosítót.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Vagyunk itt paran olyanok is, akik nem utasitjuk el elbol az AI-t, viszont tudjuk a hatarait, mert tisztaban vagyunk vele, hogyan mukodik.

Legalabb ezt mindenkepp ajanlom, de van egy sorozata is. Kisebb python tudas mindenkepp ajanlott az utobbihoz, elobbihez semmi nem kell.

A strange game. The only winning move is not to play. How about a nice game of chess?

Aki AI-al akar ügyeskedni, annak nagyon ajánlom legalább ezt az egy kurzust végighallgatni: https://www.coursera.org/learn/generative-ai-prompt-engineering-for-eve…

Ha sok, akkor legalább az első rész utolsó egy percét (már ha jól emlékszem), ahol elmondja a jóember, hogy mi kell egy propmtba.

Én biztos, hogy nem az nmcli-vel kezdenék, értem, hogy redhat és ott biztos van, de egy 

ip link list | awk '/link\/ether/ {print $2}'

parancs kiadja az összes létező MAC addresst a rendszerben, onnan azt csinálsz vele, amit akarsz. És ha csak azt akarod ellenőrizni, hogy egy adott licenc mac-ja szerepel, akkor egyszerűen megnézed, hogy a licenc megfelelő része szerepel-e ebben a listában, és akkor az sem probléma, ha több interface van.

Hmm, jogos. Végül is feltételezem, hogy egy interfész van, csak épp a nevét nem tudom (igen, ebben az esetben nem is számít).

Viszont akkor:

tr -d : < /sys/class/net/!(lo)/address

Oké, ehhez kell extglob, de az a frissen telepített gépen - úgy látszik - be van kapcsolva.

Nha, ezen kéne még optimalizálni :D

Hát, /sys/class/net/<iface>/address az a 2.6.12-es kernel óta létezik, ezt bevállalom :)

Debian:

fisher@s2:~$ jq
-bash: jq: command not found

Őszintén meglep, hogy a Red Hat 9-en ott van.

Aha, valszeg azért nem működik, mert több interfész van, ami az esetemben/adott esetben biztosan nem így van. Ez gondolom működik:

fisher@s2:~$ cat /sys/class/net/!(lo)/address| tr -d : | head
024298b74e22
02423351d8e7
0242ffc7446c
024220de40fb
0242abf0d17d
02428d31979b
024276b2a2a0
0242726e9b50
024252f2b736

Vagy akár:

tr -d :  <<< $(cat /sys/class/net/!(lo)/address)

Nem az az érdekes mióta van hanem hogy azóta konzisztens-e a formátuma vagy meddig lesz még ugyanaz a formátum. Nem gyakori, hogy változnak, de törtek már el scriptjeim amik a sysfs-t parseolták (igaz ebből pár eset volt csak hogy core kernel válozás volt, nagyrészt driver exposure volt sysfs-el amin a driver író jóindulátára vagy utalva).

HA ez nem gond, mert a környezet (OS verzió, stb) nem fog változni, SELinux nem korlátozza a sysfs elérést (vagy root vagy) akkor tökéletes a legalsó is, vagy bármelyik tetszőlegesen.

Ez meg megnézi a default route-ot, és azt az interfészt nézi:
ip link list $(ip ro | awk '/^default/ { print $5}') | awk '/link\/ether/ {gsub(":" , "", $2 ); print $2}'

de ha tényleg csak egy fizikai interfészed van, akkor:
lshw -c LAN 2>/dev/null | awk '/serial:/ { gsub(":" , "", $2 ); print $2 }'

is jó lehet