我需要以编程方式检测 Linux 是否正在 ThinkPad 上运行。
shell 脚本将是理想的但如果只有自定义程序能够,我可以通过下载一些源代码并在机器上编译它来以编程方式生成任何二进制文件可靠地去做。
重点是:可靠性/准确性。如果有疑问,我更喜欢不是运行脚本。
我有预感,这可以通过使用 dmesg 或 等文本解析来巧妙地完成lshw
,但哪种方法最可靠?
限制:作为登录脚本的一部分以普通用户身份运行,不可能暂时提升权限只是为了检测机器型号。
允许: 只要需要就可以,速度不是一个因素。
环境:Ubuntu,但 Linux 的通用性很好。开发人员级构建工具的可用性(可以假设 GCC“正常工作”)。登录脚本由 bash 运行,因此该语法中的代码片段将更直接可用。
答案1
以下内容在我的 Lenovo ThinkPad(运行 FC17)上有效:
cat /sys/devices/virtual/dmi/id/chassis_vendor
印刷:
LENOVO
可以检查以下目录/proc/acpi/ibm/
。您可以查找/proc/acpi/ibm/driver
“ThinkPad ACPI Extras”。
答案2
dmidecode 可以提供此信息。然而,它需要root权限才能访问/dev/mem,因此由于您的限制,它不能直接使用。
你有两个选择。
A) 以 root 身份登录并运行dmidecode -t system > /var/tmp/dmidecode_system
然后确保该文件是全局可读的,并在用户的登录脚本中检查该文件的内容。
问题是信息只能“手动”更新。然而,您可以简单地从初始化脚本更新它。
B) 更“实时”的选项是创建一个小工具,为非特权进程提供所需的信息。
首先创建一个接口,例如mkfifo /var/tmp/dmidecode_read
然后生成一个进程,每次有人请求时都会写入信息,例如
while true; do dmidecide -t system > /var/tmp/dmidecode_read; done
在这种情况下,这将起作用,因为您无法在系统运行时更换主板。但为了完整起见,我提到这些信息理论上仍然可能变得过时。每次用户从管道中读取数据时,当前缓冲区都会被清空,休眠的“供应商”就会存在,然后在读取器收到现有缓冲区后,将生成一个新的“供应商”,并将新的信息放入缓冲区中为下一位读者做好准备,无论何时。