Czy możemy wygenerować unikalny identyfikator dla każdego komputera, coś w rodzaju uuuidgen, ale nigdy się nie zmieni, chyba że nastąpią zmiany sprzętowe? Myślałem o połączeniu CPUID i MACADDR i skrótu, aby wygenerować spójny identyfikator, ale nie mam pojęcia, jak je parsować za pomocą skryptu bash, wiem, jak mogę uzyskać CPUID
dmidecode -t 4 | grep ID
i
ifconfig | grep ether
następnie muszę połączyć te ciągi szesnastkowe i mieszać je za pomocą sha1 lub md5, aby utworzyć ciąg szesnastkowy o stałej długości.
Jak mogę przeanalizować ten wynik?
bash
- do wygenerowania UUID na dowolnym systemie Linux.cat /proc/sys/kernel/random/uuid
.Odpowiedzi:
A co z tymi dwoma:
Następnie możesz je łączyć i mieszać za pomocą:
Aby usunąć końcową kreskę, dodaj jeszcze jedną rurkę:
Jak wskazuje @mikeserv w swojej odpowiedzi , nazwa interfejsu może się zmieniać między butami. Oznacza to, że dzisiejszym eth0 może być jutro eth1, więc jeśli grep dla niego,
eth0
możesz uzyskać inny adres MAC na różnych butach. Mój system nie zachowuje się w ten sposób, więc nie mogę naprawdę przetestować, ale możliwe rozwiązania to:Witaj
HWaddr
w danych wyjściowych,ifconfig
ale zachowaj wszystkie, nie tylko te odpowiadające konkretnej karcie sieciowej. Na przykład w moim systemie mam:Chwytając oba adresy MAC i przekazując je
sha256sum
, powinieneś być w stanie uzyskać unikalną i stabilną nazwę, niezależnie od tego, która karta sieciowa nazywa się:Zauważ, że skrót różni się od powyższych, ponieważ przekazuję oba adresy MAC zwrócone przez
ifconfig
sięsha256sum
.Zamiast tego utwórz skrót na podstawie identyfikatorów UUID dysków twardych:
źródło
Po pierwsze, należy pamiętać, że CPUID zdecydowanie nie jest powszechnie dostępnym, jednoznacznie identyfikującym markerem dla jakiegokolwiek systemu późniejszego niż Intel Pentium III. Chociaż mieszanie go z adresami MAC może z pewnością prowadzić do unikalnych znaczników, jest to spowodowane jedynie unikalnymi cechami samych MAC, a CPUID w tym przypadku jest niczym więcej jak tylko poszlakami. Co więcej, wynikowy skrót nie jest bardziej unikalny niż UUID płyty głównej, i jest to znacznie łatwiejsze do odzyskania, a proces jest znacznie mniej podatny na błędy. Z wikipedia.org/wiki/cpuid :
Możesz zobaczyć sparsowany cpuid sam, robiąc
cat /proc/cpuinfo
lub nawet po prostulscpu
.To daje ci wszystkie adresy MAC interfejsów sieciowych rozpoznawanych przez jądro Linuksa, tak myślę:
Może być konieczne odfiltrowanie tej listy, jeśli może ona zawierać wirtualne karty sieciowe z losowo generowanymi adresami MAC. Możesz to zrobić bezpośrednio z flagami w wywołaniu
ip
. Zobacz,ip a help
jak to zrobić.Należy również pamiętać, że ten problem nie jest unikalny
ip
i należy go rozwiązać, jeśli go używaszifconfig
, ale że można go bardziej pewnie rozwiązaćip
- który jest częściąiproute2
pakietu sieciowego i jest aktywnie utrzymywany - niż możeifconfig
- który jest członkiem znet-tools
opakowania i ostatni zobaczył Linux kin w 2001 roku . Ze względu na zmieniające się funkcje jądra od czasu jego ostatniego wydania,ifconfig
jest to znane misreport jakieś flagi funkcji sieci i jej stosowanie należy unikać, jeśli to w ogóle możliwe.Zrozum jednak, że filtrowanie za pomocą nazw interfejsów jądra, takich jak,
eth[0-9]
nie jest niezawodnym sposobem, aby to zrobić, ponieważ mogą się one zmieniać w zależności od kolejności równoległego wykrywaniaudev
podczas procesu rozruchu. Więcej informacji na ten temat można znaleźć w części Przewidywalne nazwy sieciowe .Ponieważ
dmidecode
nie jest zainstalowany w moim systemie, na początku pomyślałem o utworzeniu listy numerów seryjnych dysków twardych, takich jak:Zrób
lsblk --help
kilka wskazówek na temat dopracowywania tej listy - powiedzmy według typu dysku. Weź również pod uwagęlspci
i / lublsusb
może.Łączenie ich jest łatwe:
Jak już poinformowałeś mnie, że kluczujesz zasoby użytkownika na jego unikalne identyfikatory, a na dyskach twardych nie można polegać, że istnieją, pomyślałem o zmianie halsu.
Biorąc to pod uwagę, ponownie spojrzałem na system plików i znalazłem
/sys/class/dmi/id
folder. Sprawdziłem kilka plików:Jednak ten wydaje się być całkiem dobry, ale nie opublikuję wyniku:
Spodziewam się, że i tak
dmidecode
dostaje większość swoich informacji i tak naprawdę to wygląda . Wedługman dmidecode
Ciebie możesz również znacznie uprościć korzystanie z tego narzędzia, podając argument:Jeszcze prościej, możesz po prostu odczytać plik. Pamiętaj, że ten konkretny plik konkretnie identyfikuje płytę główną. Oto fragment poprawki do jądra z 2007 r., Która pierwotnie implementowała te eksporty do
/sysfs
wirtualnego systemu plików:Możesz użyć tych danych samodzielnie do identyfikacji systemu - jeśli płyta główna jest wystarczająca. Ale możesz połączyć te informacje z MAC systemu w taki sam sposób, jak pokazałem, że możesz zrobić z dyskami twardymi:
Jądro Linux może również generować dla Ciebie UUID:
Lub:
To prawda, to generowany losowo i trzeba będzie przemyśleć cesji osobistego, ale tu chodzi o tak proste, jak to robi się dostać przynajmniej. I powinno być całkiem solidne, jeśli możesz znaleźć sposób, aby to kluczować.
Wreszcie w systemach UEFI jest to o wiele łatwiejsze - ponieważ każda zmienna środowiskowa oprogramowania układowego EFI zawiera własny identyfikator UUID. Zmienna środowiskowa
{Platform,}LangCodes-${UUID}
powinna być obecna w każdym systemie UEFI, powinna trwać ponowne uruchamianie, a nawet większość aktualizacji i modyfikacji oprogramowania układowego, a każdy system Linux zefivarfs
załadowanym modułem może wyświetlać jedną lub obie nazwy tak po prostu:Starsza forma -
LangCodes-${UUID}
najwyraźniej jest teraz przestarzała i na nowszych systemach powinna być,PlatformLangCodes-${UUID}
ale zgodnie ze specyfikacją, jedno lub drugie powinno być obecne w każdym systemie UEFI. Przy niewielkim wysiłku możesz zdefiniować własne zmienne trwałe przy ponownym uruchomieniu komputera i być może w ten sposób lepiej wykorzystać generator UUID jądra. W razie zainteresowania zajrzyj do efitools .źródło
ip2
jest specjalnie zaprojektowany do analizowania i być może nie robię tego wystarczająco dobrze - podejrzewam, że to samo można zrobić prawie bezgrep/sed
. Prawdopodobnie to samo można zrobić tak łatwoudevadm
. Każda nazwa zmiennej środowiskowej EFI została zaprojektowana w taki sposób, aby była jednoznacznie identyfikowana właśnie w tego rodzaju sytuacjach.Wiele współczesnych dystrybucji dostarcza plik
/etc/machine-id
zawierający najprawdopodobniej unikalny szesnastkowy ciąg 32 znaków. Pochodzi z systemd, gdzie strona man ma więcej informacji i może być odpowiednia do twojego celu.źródło
dbus
specyficzne, jak sądzę, i zmienia się, jeśli system operacyjny zostanie wyczyszczony / ponownie zainstalowany.Na wielu komputerach z systemem Linux plik
/var/lib/dbus/machine-id
zawiera unikatowy identyfikator dla każdej dystrybucji systemu Linux i można uzyskać do niego dostęp, wywołując poleceniedbus_get_local_machine_id()
. Jest to prawdopodobnie to samo, co/etc/machine-id
wspomniane powyżej. Działa również w wirtualnych instalacjach Linuksa. Sprawdziłem to w obecnych dystrybucjach Ubuntu, SuSE i CentOS.źródło
/etc/machine-id
.Czy potrzebujesz identyfikatora komputera, aby zmienić, gdy zmienia się sprzęt? Czy identyfikator maszyny jest używany do ochrony czegoś? Uważam, że najlepszym sposobem na uzyskanie „spójnego” identyfikatora maszyny jest przechowywanie losowego ciągu znaków w systemie. W ten sposób, jeśli którykolwiek z elementów sprzętu ulegnie zmianie, identyfikator komputera również się nie zmieni. Jest to również dobre w przypadku systemów zwirtualizowanych, w których dostęp sprzętowy jest ograniczony, a identyfikator MAC to 00: 00: 00: 00
Spróbuj czegoś takiego jak ten skrypt sh, aby utworzyć i uzyskać identyfikator:
źródło
/dev/urandom
tak wskazuje Linux, możesz po prostu zrobić,cat /proc/sys/kernel/random/uuid >$FILE
co losowo generuje poprawnie sformatowany UUID przy każdym czytaniu. Mimo to utrwalanie zaimplementowane na dysku podlega usunięciu, a pod warunkiem, że jest to dopuszczalne, a pod warunkiemdbus
, że jest zainstalowane, prawdopodobnie powinieneś zrobić tak, jak sugerował @XZS.Pozostałe odpowiedzi podają wiele sposobów wydobywania identyfikatorów ze sprzętu. Możesz zdecydować się na użycie jednego elementu sprzętu jako identyfikatora lub wielu. Jest to problematyczne, jeśli trzeba dowolnie zamieniać lub wymieniać sprzęt.
Niektóre osoby mogą zamiast tego przechowywać identyfikator wygenerowanego identyfikatora na dysku twardym (lub użyć identyfikatora UUID), ale dyski twarde można klonować.
Moduły TPM i bezpieczny rozruch mogą zapewnić sposób wiązania płyty głównej i innego sprzętu z instalacją na dysku twardym.
W takich przypadkach zawsze jest trochę łatwiej, jeśli podasz więcej informacji o tym, co chcesz osiągnąć.
źródło