如何在没有root特权的情况下获取dmidecode信息?


16

我正在编写一个显示各种系统信息的程序(在CentOS系统上)。例如,处理器类型和速度(从/proc/cpuinfo),上次启动时间(从/proc/uptime)计算,IP地址(从ifconfig输出),以及已安装打印机的列表(从lpstat输出)。

当前,从dmidecode程序中获得了一些数据:

  • 平台类型(dmidecode -s system-product-name
  • BIOS版本(dmidecode -s bios-version
  • 物理内存量(个dmidecode -t17 | grep Size

仅当我的程序以root身份运行时,这些才可用(因为否则,dmidecode子进程会因/dev/mem: Permission denied错误而失败)。有没有其他方法可以获取此信息,普通用户可以访问?

Answers:


4

我刚刚在CentOS 5系统上进行了检查-之后:

chgrp kmem /usr/sbin/dmidecode
chmod g+s /usr/sbin/dmidecode

仍然无法使dmidecode运行-kmem组仅具有/ dev / mem的读权限-似乎涉及写入操作才能获取BIOS信息。

因此,还有一些其他选择:

  1. 使用sudo
  2. 使用其他信息源(例如/ proc / meminfo)
  3. 使用初始化脚本将dmidecode的静态输出写入世界可读的文件

6

所提供的某些信息dmidecode可在上找到/sys/devices/virtual/dmi/id

通过分析可以获取其他信息/proc/cpuinfo/proc/meminfo或者/sys/system/node/node0/meminfo


1
为+1 /sys/devices/virtual/dmi/id。那里有很多平台特定的信息。有关方便的脚本,请参见unix.stackexchange.com/questions/75750/…。对于系统信息,您的其他句子也很好。有很多类似的实用程序free,甚至htop可以为您提供所需的工具。
Mike S

6
  1. 我可以在下以User身份读取DMI信息/sys/class/dmi/id/。不包括序列号(需要root特权才能读取)。

    我想这是隐私意识内核开发人员的预期行为。

  2. 关于dmesgdmesg是用于访问内核环形缓冲区的命令。环形缓冲区表示当缓冲区“溢出”时,较旧的信息将被较新的信息覆盖。同样,这是读取内核模块调试输出,这从来都不是可解析的。

  3. 要通过systemd运行访问内核输出:

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. 关于david-homernils的答案:该文件/dev/mem不仅提供内存信息,还将整个物理内存映射到用户空间。因此,人们可以通过它访问DMI内存地址(并且可以做更多讨厌的事情)。

  5. 关于chgrpchmod g+sdmidecode尼尔斯的答案:我想这不会工作按预期,因为节省GID用chmod g+s不会使dmidecode使用它的新特权。dmidecode必须先调用setegid以设置其有效的网上论坛ID,然后才能访问/dev/mem。从它的源代码来看,dmidecode不会这样做。


1
3.的补充:在不systemd读取的情况下访问系统上的内核输出/var/log/kern.log。如果系统仍在使用时没有此类文件syslogd,请尝试查找其中的kern.*条目/etc/syslog.conf以找出其位置。
罗斯兰

5

尝试dmesg。我可以通过普通用户帐户获取所需的信息。


不知道为什么你被否决了。我已根据您的解决方案给出了更详细的答复,以供所有人查看。我认为您的解决方案很好。
wally 2014年

4

我们正在使用DMIDecode从远程Linux系统读取信息,但尚未找到解决方法。我已经在dmidecode主页上记录了一个呼叫,询问此问题...

使用命令dmidecode -t system会给出错误“ / dev / mem:权限被拒绝”,这是一个问题,因为我们不需要内存信息(只是制造商,型号和序列号)。

我注意到,在SunOS上运行的smbios命令可以很好地处理此信息,而无需root特权。

现在,我将用“用户根凭据”替换说明“使用具有最少所需特权的特定帐户”的文档。


4

lshal 包含很多相同的信息,并且不需要root特权。


我不知道为什么这否决,grepping它,它给了我正是我所需要的信息,lshal | grep system.product为系统的名称,甚至是戴尔服务标签用lshal | grep smbios.system.serial
马克·布斯

2
@MarkBooth可能是因为HAL已被弃用,而不是在现代发行版中提供。
罗斯兰

lshal最终在RHEL7中完全消失了,我现在正在使用它sudo cat /sys/devices/virtual/dmi/id/chassis_serial来获取Dell服务标签,但这仅在我可以cat通过sudoers 访问时才起作用。
Mark Booth

4

我不确定为什么@mtneagle被拒绝投票。

OP想要的三个项目是:

平台类型(dmidecode -s system-product-name
BIOS版本(dmidecode -s bios-version
物理内存量(dmidecode -t17 | grep Size

这样我们就可以得到每个:

dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "1"
dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "2"
dmesg | grep "Memory:" | cut -d '/' -f '2-' | cut -d ' ' -f '1'

(或者至少可以在我拥有的4个不同的硬件服务器上工作,并且对于Xen guest虚拟机上的BIOS或服务器类型完全不返回任何内容。)

我错过了明显的事情吗?


更新:感谢@Ruslan指出我错过的明显之处。

报价:

是的,你有。内核消息存储在环形缓冲区中。打印太多行时,将删除第一行。

因此,如果您的计算机已经工作了好几个星期,并且至少每天都暂停/恢复它,则很有可能您在此处获取的信息将不再位于缓冲区中。

(我这里的正常运行时间为18天。)最好调查一下 /var/log/kern.log

就像是 grep DMI: /var/log/kern.log | tail -n1


3
是的,你有。内核消息存储在环形缓冲区中。打印太多行时,将删除第一行。因此,如果您的计算机已经工作了好几个星期,并且至少每天都暂停/恢复它,则很有可能您grep在此处获得的信息将不再处于缓冲区中。(我在这里遇到这种情况,需要18天的正常运行时间。)研究一下可能会更好/var/log/kern.log。有点像grep DMI: /var/log/kern.log | tail -n1
罗斯兰

谢谢-希望您不要介意,我已在您的回答中注明了您的评论(以致谢)。
沃利

2

要获得的物理内存总量,可以解析/proc/meminfofreevmstat,等你也可以分析内核消息缓冲区,因为它是在0时谈论它。

BIOS版本更加困难,我不认为以非root用户身份可以做到这一点,但我可能是错的。它(和系统产品名称)有可能暴露在某个地方,也许在/sys/或中/proc/,但我找不到任何东西。


2
还提到了BIOS,因此请查阅内核日志或dmesg它是否填满过多。示例行:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
Lekensteyn 2011年

cat /sys/devices/virtual/dmi/id/bios_version... Voila'!但是YMMV。并非所有体系结构都具有这种路径。x86_64 Intel应该。
Mike S

2

我们的Linux服务不是以root身份运行。在RPM安装后脚本(确实以root用户运行)中,我们安装了/etc/sudo.d文件并设置了一些可执行文件的容量(例如,用于网络广播权限)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.