Estoy escribiendo un programa que muestra diversa información del sistema (en un sistema CentOS). Por ejemplo, el tipo de procesador y la velocidad (desde /proc/cpuinfo
), el último tiempo de inicio (calculado desde /proc/uptime
), la dirección IP (desde la ifconfig
salida) y una lista de impresoras instaladas (desde la lpstat
salida).
Actualmente, se obtienen varios datos del dmidecode
programa:
- El tipo de plataforma (
dmidecode -s system-product-name
) - La versión del BIOS (
dmidecode -s bios-version
) - La cantidad de memoria física (
dmidecode -t17 | grep Size
)
Estos solo están disponibles si mi programa se ejecuta como root (porque de lo contrario el dmidecode
subproceso falla con un /dev/mem: Permission denied
error). ¿Hay alguna forma alternativa de obtener esta información, a la que pueda acceder un usuario normal?
fuente
/sys/devices/virtual/dmi/id
. Mucha información específica de la plataforma está disponible allí. Para ver un script útil, consulte unix.stackexchange.com/questions/75750/… . Para información del sistema, su otra oración también es buena. Hay muchas utilidades comofree
o inclusohtop
que pueden obtener lo que desea.Puedo leer la información DMI como usuario bajo
/sys/class/dmi/id/
. No incluye números de serie (que requieren privilegios de root para leer).Supongo que este es el comportamiento previsto por los desarrolladores de kernel conscientes de la privacidad.
En cuanto a
dmesg
:dmesg
es un comando para acceder al búfer de anillo del núcleo. El búfer en anillo implica que los datos nuevos sobrescriben la información anterior cuando el búfer se "desborda". Además, esto es leer la salida de depuración del módulo del kernel que nunca fue pensada para ser analizable.Para acceder a la salida del kernel con
systemd
run:Con respecto a las respuestas de david-homer y nils : el archivo
/dev/mem
no solo proporciona información de memoria, sino que asigna toda la memoria física al espacio del usuario. Por lo tanto, se puede acceder a las direcciones de memoria DMI a través de él (y hacer cosas mucho más desagradables).En cuanto
chgrp
ychmod g+s
dedmidecode
en Nils respuesta: Creo que esto no funcionará como se pretende, porque el ahorro de GID conchmod g+s
no hagadmidecode
uso de sus nuevas privilegios.dmidecode
tiene que llamarsetegid
para configurar su identificación de grupo efectiva antes de que pueda acceder/dev/mem
. A juzgar por su código fuente,dmidecode
no hace eso.fuente
systemd
solo leer/var/log/kern.log
. Si no existe dicho archivo mientras el sistema todavía lo está utilizandosyslogd
, intente buscarkern.*
entradas/etc/syslog.conf
para averiguar su ubicación.Prueba dmesg. Pude obtener la información que quería de esta manera con una cuenta de usuario normal.
fuente
Estamos utilizando DMIDecode para leer información de sistemas remotos de Linux y todavía no hemos encontrado una solución. He registrado una llamada en la página de inicio de dmidecode preguntando sobre esto ...
El uso del comando dmidecode -t system da el error "/ dev / mem: Permiso denegado", que es un problema ya que no queremos información de memoria (solo fabricante, modelo y número de serie).
Noté que el comando smbios que se ejecuta en SunOS funciona bien para esta información sin necesidad de privilegios de root.
Por ahora voy a reemplazar nuestra documentación que dice "usar una cuenta específica con el privilegio menos requerido" con "credenciales de usuario root".
fuente
lshal
contiene mucha de esa misma información y no requiere privilegios de root.fuente
lshal | grep system.product
para el nombre del sistema, e incluso la etiqueta de servicio de Dell conlshal | grep smbios.system.serial
lshal
finalmente desapareció por completo en RHEL7 y ahora lo estoy usandosudo cat /sys/devices/virtual/dmi/id/chassis_serial
para obtener la etiqueta de servicio de Dell, pero esto solo funciona porque tengo acceso acat
través de sudoers.No estoy seguro de por qué @mtneagle fue rechazado.
Los tres elementos que el OP quería son:
El tipo de plataforma (
dmidecode -s system-product-name
)La versión del BIOS (
dmidecode -s bios-version
)La cantidad de memoria física (
dmidecode -t17 | grep Size
)Podemos obtener cada uno de estos de esta manera:
(O al menos esos funcionan en los 4 servidores de hardware diferentes que tengo, y no devolvieron nada para BIOS o tipo de servidor en un invitado Xen).
¿Me he perdido algo obvio?
Actualización: Gracias a @Ruslan por señalar lo obvio que me perdí.
Citando:
fuente
grep
aquí ya no esté en el búfer. (Tengo una situación de este tipo con un tiempo de actividad de 18 días aquí). Puede ser mejor investigar/var/log/kern.log
. Algo así comogrep DMI: /var/log/kern.log | tail -n1
.Para obtener la cantidad total de memoria física, puede analizar
/proc/meminfo
,free
,vmstat
, etc. Se puede también analizar el búfer de mensajes del núcleo, ya que habla de ello en el tiempo 0.La versión del BIOS es más difícil, no creo que esto sea posible como usuario no root, pero puedo estar equivocado. Es posible que (y el nombre del producto del sistema) estén expuestos en algún lugar, tal vez en
/sys/
o/proc/
, pero no puedo encontrar nada.fuente
dmesg
si no se llenó demasiado. Línea de ejemplo:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
cat /sys/devices/virtual/dmi/id/bios_version
... Voila '! Pero YMMV. No todas las arquitecturas tienen este camino. x86_64 Intel debería.Nuestros servicios de Linux no se ejecutan como root. En la secuencia de comandos posterior a la instalación de RPM (que se ejecuta como root), instalamos un archivo /etc/sudo.d y configuramos algunos de nuestros ejecutables (por ejemplo, para privilegios de transmisión de red).
fuente