Jak mogę wygenerować prawidłowy losowy adres MAC za pomocą bash.
Pierwsza połowa adresu powinna zawsze pozostać taka sama
00-60-2F-xx-xx-xx
tylko wartość x powinna być generowana losowo?
bash
mac-address
NES
źródło
źródło
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'
Odpowiedzi:
Oto ryba.
Ten skrypt powłoki wygeneruje szukany ciąg losowy:
Właśnie miałem tutaj coś, co pokazało, jak uruchomić go z wiersza poleceń, ale po spojrzeniu na skomplikowane (ale uprzywilejowane) rozwiązanie Dennisa Williamsona widzę, że ludzie oczekują odpowiedzi, w której nie muszą wykonywać żadnej pracy sami.
źródło
W przeszłości robiłem to za pomocą:
ale dzięki temu będą tylko w zakresie 0–9. Dla moich celów było to wystarczająco dobre.
Prawdopodobnie lepszym rozwiązaniem byłoby użycie printf:
Oto jak to działa:
źródło
%02X
dałby jedną wielką literę.Lub w python:
Zauważ, że wersja Pythona używa tylko 16-polowego pola do wygenerowania znaku szesnastkowego, więc nie musisz się martwić o zerowanie dopełniania - poprawiono podejście, aby odpowiedzieć na komentarz.
źródło
00-60-2F-8B-5-2C
,00-60-2F-A-71-97
,00-60-2F-82-F1-4
.Za pomocą standardowych narzędzi
lub
może być najkrótszy ze wszystkich.
źródło
Klucze do sposobu, w jaki to działa:
LC_CTYPE=C
- zezwala na znaki> 0x7FIFS=
- wyłącza interpretację\t
(tab),\n
(nowa linia) i spacji-d ''
- pozwala na nowe linie-r
pozwala\
(i prawie zawsze powinien być używany przez nawyk zread
)-%02x\n
powoduje, że wyjście jest dosłownym łącznikiem, po którym następuje dwucyfrowa liczba szesnastkowa, w razie potrzeby z wiodącym zerem. Nowa linia jest tutaj zbędna i można ją pominąć.read
Dostaje jeden bajt (-n 1
) z/dev/urandom
zakresu od 0 do 255 (00
zFF
).Pojedynczy cudzysłów w ostatnim argumencie do
printf
pętli powoduje, że znak jest wyprowadzany jako jego wartość liczbowa („A” jest wyprowadzane jako „65”). Zobacz specyfikację POSIX,printf
gdzie jest napisane:źródło
IFS= read …
unikać składania 09 0a i 20 (zwykłe znaki IFS) do 00.-d ''
. Naprawię moją odpowiedź. Dzięki, że dałeś mi znać.-r
który chroni `\` wypadł. Chciałbym, aby właściwe przetwarzanie danych binarnych w programach powłoki nie było tak skomplikowane. Seems Wydaje się niemożliwe dokładne odwzorowanie 00 na środku łańcucha. Twoja metoda jednoznakowa na raz obsługuje 00 dzięki wygodnej (zaprojektowanej?) Współpracy międzyread
interpolacją ciągów znaków iprintf
traktowaniu argumentu jednoznakowego'
. Westchnienie.hexdump -C
.Najkrótszym sposobem, jaki mogłem wymyślić, było użycie zrzutu heksadecymalnego bezpośrednio
Testowany na GNU / Linux
źródło
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
jest nieco krótszy :-)Kolejne rozwiązanie jednoliniowe
To samo wielkie litery
Wygeneruj go dla zmiennej środowiskowej Bash
Detale:
od (ósemkowy zrzut)
-An
Pomija wiodącą reprezentację adresu (dodatkowy szum) na wyjściu.-N3
Ogranicz dane wyjściowe do trzech bajtów.-t xC
Dane wyjściowe w postaci szesnastkowej, ASCII, zgodnie z życzeniem./dev/urandom
Pseudo-plik jądra systemu Linux.sed (edytor strumieniowy) Dla podstawienia spacją do łącznika.
-e <SCRIPT>
wykonać skrypt sed.tr (tłumaczenie napisów) Opcjonalne, w tym przykładzie. W moich skryptach / środowisku lubię duże adresy MAC.
źródło
źródło
To powinno działać
źródło
źródło
Ten też działa. W razie potrzeby dane wyjściowe są pisane wielkimi literami.
źródło
Działa to w klasycznym
#!/bin/sh
skrypcie shell ( ):Lub jeśli chcesz mieć niestandardowy prefiks:
Przykładowe użycie:
źródło
Inną opcją jest użycie
jot
:-w
zmienia format,-s
zmienia separator i-r
generuje liczby losowe.Polecenia użyte
od
w odpowiedziach opublikowanych przez artistoex i zero2cx dodają dodatkowe myślniki do danych wyjściowych w OS Xod
, ale to nie:OS X
od
(/usr/bin/od
poniżej) używa innego formatu wyjściowego niż GNUod
:źródło
jot -w%02X -s- -r 3 1 256
najot -w%02X -s- -r 3 0 256
.W systemie Linux:
Wyjaśnienie:
W systemie Linux
/proc/sys/kernel/random/uuid
zwraca nowy UUID typu 4 (losowy) za każdym razem, gdy go czytasz. Większość jego znaków to (pseudo) losowe cyfry szesnastkowe, więc możemy ich użyć. Na przykład:Teraz wystarczy
00-60-2f-
najpierw wydrukować (bez nowej linii):Plusy:
printf
icut
są narzędziami POSIX;Cons:
/proc/sys/kernel/random/uuid
może nie być dostępny w niektórych systemach;źródło
Jedna wkładka (bash)
wynik
źródło