Podemos gerar um ID exclusivo para cada PC, algo como uuuidgen, mas ele nunca será alterado a menos que haja alterações de hardware? Eu estava pensando em mesclar CPUID e MACADDR e misturá-los para gerar uma identificação consistente, mas não tenho idéia de como analisá-los usando o script bash, o que sei é como obter o CPUID de
dmidecode -t 4 | grep ID
e
ifconfig | grep ether
então eu preciso combinar essas seqüências de caracteres hexadecimais e usá-las usando sha1 ou md5 para criar uma sequência hexadecimal de comprimento fixo.
Como posso analisar essa saída?
bash
- para gerar um UUID em qualquer Linux.cat /proc/sys/kernel/random/uuid
.Respostas:
Que tal esses dois:
Você pode então combiná-los e hash-los com:
Para remover o traço à direita, adicione mais um tubo:
Como @mikeserv aponta em sua resposta , o nome da interface pode mudar entre as botas. Isso significa que o que é eth0 hoje pode ser eth1 amanhã, portanto, se você
eth0
desejar, poderá obter um endereço MAC diferente em botas diferentes. Meu sistema não se comporta dessa maneira, então não posso realmente testar, mas as soluções possíveis são:Grep for
HWaddr
na saída de,ifconfig
mas mantenha todos eles, não apenas o correspondente a uma NIC específica. Por exemplo, no meu sistema, tenho:Ao pegar os dois endereços MAC e transmiti-los
sha256sum
, você poderá obter um nome único e estável, independentemente da NIC denominada como:Observe que o hash é diferente dos acima, porque estou passando os dois endereços MAC retornados por
ifconfig
parasha256sum
.Crie um hash com base nos UUIDs do (s) seu (s) disco (s) rígido (s):
fonte
Em primeiro lugar, observe que o CPUID definitivamente não é um marcador de identificação única comumente acessível para qualquer sistema posterior a um Intel Pentium III. Embora o hash com endereços MAC possa levar a marcadores únicos, certamente, isso se deve apenas às qualidades únicas dos próprios MACs e o CPUID, nesse caso, nada mais é do que circunstancial. Além disso, o hash resultante provavelmente não será mais exclusivo que o UUID da placa-mãe, e isso é muito mais fácil de recuperar e o processo é muito menos propenso a erros. Em wikipedia.org/wiki/cpuid :
Você pode visualizar uma CPU analisada fazendo
cat /proc/cpuinfo
ou apenas issolscpu
.Isso fornece a você todos os endereços MAC para as interfaces de rede reconhecidas pelo kernel do Linux, eu acho:
Pode ser necessário filtrar essa lista se ela incluir redes virtuais com MACs gerados aleatoriamente. Você pode fazer isso com sinalizadores na chamada para
ip
diretamente. Vejaip a help
para obter informações sobre como fazer isso.Observe também que esse problema não é exclusivo
ip
e também deve ser tratado se você o usarifconfig
, mas que pode ser tratado com mais segurançaip
- que faz parte doiproute2
conjunto de redes e é mantido ativamente - do que comifconfig
um membro. donet-tools
pacote e vi pela última vez um lançamento do Linux em 2001 . Devido à alteração dos recursos no kernel desde seu último lançamento,ifconfig
é conhecido por relatar mal alguns sinalizadores de recursos de rede e seu uso deve ser evitado, se possível.No entanto, entenda que a filtragem com nomes de interface do kernel
eth[0-9]
não é um meio confiável de fazê-lo, pois eles podem mudar com base na ordem de detecção em paraleloudev
durante o processo de inicialização. Consulte Nomes de rede previsíveis para obter mais informações.Como
dmidecode
não está instalado no meu sistema, pensei inicialmente em um hash de uma lista de séries de disco rígido geradas como:Faça
lsblk --help
algumas dicas sobre como refinar essa lista - por tipo de disco, digamos. Considere tambémlspci
e / oulsusb
talvez.Combiná-los é fácil:
Como você me informou, você está direcionando os recursos do usuário para seus IDs exclusivos, e não é possível confiar nos discos rígidos, pensei em mudar de ideia.
Considerando isso, olhei novamente para o sistema de arquivos e encontrei a
/sys/class/dmi/id
pasta. Eu verifiquei alguns dos arquivos:No entanto, este parece ser muito bom, mas não publicarei a saída:
Espero que seja lá que
dmidecode
consiga grande parte de suas informações e, de fato, pareça . De acordo comman dmidecode
você, você também pode simplificar bastante o uso dessa ferramenta especificando o argumento:Mais simples ainda, você pode apenas ler o arquivo. Observe que esse arquivo específico identifica especificamente uma placa-mãe. Aqui está um trecho do patch do kernel de 2007 que originalmente implementou essas exportações para o
/sysfs
sistema de arquivos virtual:Você pode usar esses dados sozinho para identificar o sistema - se a placa-mãe for suficiente. Mas você pode combinar essas informações com os MACs do sistema da mesma maneira que demonstrei que você pode fazer com discos rígidos:
O kernel do Linux também pode gerar UUIDs para você:
Ou:
Concedido, é gerado aleatoriamente e você terá que repensar a atribuição de ID, mas é tão fácil quanto conseguir pelo menos. E deve ser bastante sólido se você puder encontrar um meio de digitar isso.
Por fim, nos sistemas UEFI, isso se torna muito mais fácil - pois cada variável de ambiente de firmware EFI inclui seu próprio UUID. A variável de ambiente
{Platform,}LangCodes-${UUID}
deve estar presente em todos os sistemas UEFI, deve persistir reinicializações e até a maioria das atualizações e modificações de firmware, e qualquer sistema Linux com oefivarfs
módulo carregado pode listar um ou ambos os nomes da maneira mais simples:A forma mais antiga -
LangCodes-${UUID}
é, aparentemente, agora obsoleto , e em sistemas mais recentes deve serPlatformLangCodes-${UUID}
, mas, de acordo com a especificação, um ou o outro deve estar presente em todos os sistemas UEFI. Com pouco esforço, você pode definir suas próprias variáveis persistentes de reinicialização e talvez fazer mais uso do gerador UUID do kernel dessa maneira. Se estiver interessado, procure efitools .fonte
ip2
foi projetado especificamente para ser analisado e pode ser que eu não esteja fazendo o suficiente - suspeito que a mesma coisa possa ser feita quase semgrep/sed
. Provavelmente o mesmo poderia ser feito com a mesma facilidadeudevadm
. E cada nome de variável de ambiente EFI foi projetado para ser identificado exclusivamente para esse tipo de situação.Muitas distribuições modernas enviam um arquivo
/etc/machine-id
contendo uma sequência hexadecimal de 32 caracteres provavelmente mais exclusiva. É originário do systemd, onde uma página de manual possui mais informações e pode ser apropriada para o seu propósito.fonte
dbus
específico, eu acho, e muda se um sistema operacional for limpo / reinstalado.Em muitas máquinas Linux, o arquivo
/var/lib/dbus/machine-id
contém um ID exclusivo para cada distribuição Linux e pode ser acessado por uma chamada paradbus_get_local_machine_id()
. Provavelmente é o mesmo que o/etc/machine-id
mencionado acima. Também funciona em instalações virtuais do Linux. Eu verifiquei nas distribuições atuais do Ubuntu, SuSE e CentOS.fonte
/etc/machine-id
.Você precisa que o ID da máquina mude quando o hardware muda? O ID da máquina está sendo usado para proteger alguma coisa? A melhor maneira que acredito ter um ID de máquina "consistente" é armazenando uma sequência aleatória em algum lugar do sistema e, se algum hardware mudar, o ID da máquina também não será alterado. Isso também é bom para sistemas virtualizados nos quais o acesso ao hardware é restrito e o ID MAC é 00: 00: 00: 00
Tente algo como este script sh para criar e obter o ID:
fonte
/dev/urandom
indica o Linux de qualquer maneira, você pode fazer ocat /proc/sys/kernel/random/uuid >$FILE
que gera aleatoriamente um UUID formatado corretamente em cada leitura. Ainda assim, qualquer persistência implementada em disco está sujeita a exclusão e, desde que aceitável edbus
instalado, você provavelmente deve fazer o que o @XZS sugeriu.As outras respostas fornecem várias maneiras de extrair IDs do hardware. Você pode optar por usar um pedaço de hardware como identificador ou muitos. Isso é problemático se você precisar trocar ou substituir peças de hardware arbitrariamente.
Algumas pessoas podem armazenar uma identificação gerada em seu disco rígido (ou usar o UUID), mas os discos rígidos podem ser clonados.
Os módulos TPM e a inicialização segura podem fornecer um meio de vincular a placa-mãe e outro hardware com uma instalação em um disco rígido.
É sempre um pouco mais fácil nesses casos, se você fornecer mais informações sobre o que deseja realizar.
fonte