Estou escrevendo um programa que exibe várias informações do sistema (em um sistema CentOS). Por exemplo, o tipo e a velocidade do processador (de /proc/cpuinfo
), o último tempo de inicialização (calculado de /proc/uptime
), o endereço IP (de ifconfig
saída) e uma lista de impressoras instaladas (de lpstat
saída).
Atualmente, vários dados são obtidos do dmidecode
programa:
- O tipo de plataforma (
dmidecode -s system-product-name
) - A versão do BIOS (
dmidecode -s bios-version
) - A quantidade de memória física (
dmidecode -t17 | grep Size
)
Eles estarão disponíveis apenas se meu programa for executado como root (caso contrário, o dmidecode
subprocesso falhará com um /dev/mem: Permission denied
erro). Existe uma maneira alternativa de obter essas informações que um usuário normal possa acessar?
fonte
/sys/devices/virtual/dmi/id
. Muitas informações específicas da plataforma estão disponíveis lá. Para um script útil, consulte unix.stackexchange.com/questions/75750/… . Para informações do sistema, sua outra frase também é boa. Existem muitos utilitários, como esses,free
ou até mesmohtop
o que você deseja.Eu posso ler informações de DMI como Usuário em
/sys/class/dmi/id/
. Não incluindo números de série (que exigem privilégios de root para ler).Eu acho que esse é o comportamento pretendido pelos desenvolvedores de kernel que reconhecem a privacidade.
Em relação a
dmesg
:dmesg
é um comando para acessar o buffer de anel do kernel. O buffer de anel implica que as informações mais antigas são substituídas pelas mais novas quando o buffer está "transbordando". Também está lendo a saída de depuração do módulo do kernel, que nunca foi concebida para ser analisável.Para acessar a saída do kernel com
systemd
run:Em relação às respostas de david-homer's e nils : O arquivo
/dev/mem
não fornece apenas informações de memória, mas mapeia toda a memória física no espaço do usuário. Portanto, é possível acessar os endereços de memória DMI através dele (e fazer coisas muito mais desagradáveis).Em relação
chgrp
echmod g+s
dedmidecode
in nils ' resposta : acho que isso não funcionará como pretendido, porque salvar gid comchmod g+s
não fazdmidecode
uso de novos privilégios.dmidecode
precisa ligarsetegid
para definir seu ID de grupo efetivo antes que ele possa acessar/dev/mem
. A julgar pelo código fonte,dmidecode
não faz isso.fonte
systemd
apenas ler/var/log/kern.log
. Se não houver esse arquivo enquanto o sistema ainda estiver em usosyslogd
, tente procurarkern.*
entradas/etc/syslog.conf
para descobrir sua localização.Tente dmesg. Consegui obter as informações que queria dessa maneira com uma conta de usuário comum.
fonte
Estamos usando o DMIDecode para ler informações de sistemas Linux remotos e ainda não encontramos uma solução alternativa para isso. Registrei uma chamada na página inicial do dmidecode perguntando sobre isso ...
O uso do comando dmidecode -t system fornece o erro "/ dev / mem: Permissão negada", que é um problema, pois não queremos informações de memória (apenas fabricante, modelo e número de série).
Percebo que o comando smbios executado no SunOS funciona bem para essas informações sem a necessidade de privilégios de root.
Por enquanto, substituirei nossa documentação declarando "usar uma conta específica com o privilégio menos exigido" por "credenciais raiz do usuário".
fonte
lshal
contém muitas dessas informações e não requer privilégios de root.fonte
lshal | grep system.product
para o nome do sistema, e até mesmo a etiqueta de serviço Dell comlshal | grep smbios.system.serial
lshal
acabou desaparecendo completamente no RHEL7 e agora estou usandosudo cat /sys/devices/virtual/dmi/id/chassis_serial
para obter a etiqueta de serviço da Dell, mas isso só funciona quando tenho acessocat
através de sudoers.Não sei por que @mtneagle recebeu votos negativos.
Os três itens desejados pelo OP são:
O tipo de plataforma (
dmidecode -s system-product-name
)A versão do BIOS (
dmidecode -s bios-version
)A quantidade de memória física (
dmidecode -t17 | grep Size
)Podemos obter cada um destes assim:
(Ou pelo menos aqueles que funcionam nos 4 servidores de hardware diferentes que eu tenho e não retornaram nada de maneira limpa para o BIOS ou o tipo de servidor em um convidado Xen.)
Perdi algo óbvio?
Atualização: Obrigado a @Ruslan por apontar o óbvio que eu perdi.
Citação:
fonte
grep
aqui fornecidas não estejam mais no buffer. (Eu tenho uma situação desse tipo com tempo de atividade de 18 dias aqui.) Talvez seja melhor investigar/var/log/kern.log
. Algo comogrep DMI: /var/log/kern.log | tail -n1
.Para obter a quantidade total de memória física, você pode analisar
/proc/meminfo
,free
,vmstat
, etc. Você pode também analisar o buffer de mensagens do kernel, já que fala sobre ele em 0 tempo.A versão do BIOS é mais difícil, não acredito que isso seja possível como usuário não root, mas posso estar errado. É possível que ele (e o nome do produto do sistema) seja exposto em algum lugar, talvez em
/sys/
ou/proc/
, mas não consigo encontrar nada.fonte
dmesg
se não foi preenchido demais. Exemplo de linha:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
cat /sys/devices/virtual/dmi/id/bios_version
... Voila '! Mas YMMV. Nem todas as arquiteturas têm esse caminho. x86_64 Intel deveria.Nossos serviços Linux não são executados como raiz. No script de pós-instalação do RPM (que executa como root), instalamos um arquivo /etc/sudo.d e setcap alguns de nossos executáveis (por exemplo, para privilégios de transmissão de rede).
fonte