是否有任何可靠的方法可以从 bash 脚本中(以编程方式)确定它是在笔记本电脑还是台式计算机上执行?
我显然可以提示用户询问他们,但这很笨拙。
答案1
查看系统是否有电池是不可靠的——连接到系统的 UPS(不仅用于供电,还通过 USB 进行自动关机和电池监控)可能会显示为电池。
不过,有一个很好的可靠的方法:
dmidecode --string chassis-type
在笔记本电脑上,这将返回“笔记本电脑”、“笔记本”、“便携式”或“超笔记本”之一(取决于制造商在 BIOS 中编码的内容)。“识别计算机的机箱类型“在 Windows 2000 脚本指南中 - 不要担心它是 Microsoft TechNet 页面,它与操作系统无关。
dmidecode 还可以获取有关硬件制造商、系统序列号(有时)等的信息。
答案2
为了避免使用 sudo,您可以读取 的内容/sys/class/dmi/id/chassis_type
,它将返回底盘类型的十进制值。
这些值的含义可以在官方文档 PDF 中查看,网址为https://www.dmtf.org/standards/SMBIOS
下表包含 smbios 规范版本 3.5.0(2021 年 9 月 22 日)的信息。
十进制值 | 十六进制值 | 意义 |
---|---|---|
1 | 01 小时 | 其他 |
2 | 02 小时 | 未知 |
3 | 03时 | 桌面 |
4 | 04 小时 | 薄型台式机 |
5 | 05 小时 | 披萨盒 |
6 | 06 小时 | 迷你塔式机 |
7 | 07时 | 塔 |
8 | 08时 | 便携的 |
9 | 09时 | 笔记本电脑 |
10 | 0啊 | 笔记本 |
11 | 0B小时 | 手持式 |
12 | 0Ch | 扩展坞 |
十三 | 0D小时 | 一体 |
14 | 0Eh | 子笔记本 |
15 | 0Fh | 节省空间 |
16 | 10 小时 | 饭盒 |
17 | 11 小时 | 主服务器机箱 |
18 | 12 小时 | 扩展机箱 |
19 | 13 小时 | 副底盘 |
20 | 14 小时 | 总线扩展机箱 |
21 | 15 小时 | 外围底盘 |
22 | 16 小时 | RAID 底盘 |
23 | 17 小时 | 机架式机箱 |
24 | 18 小时 | 密封式 PC |
二十五 | 19 小时 | 多系统机箱 当 SMBIOS 实现指定此值时,与此结构关联的物理机箱支持多个独立报告的物理系统 — 无论机箱的当前配置如何。同一物理机箱中的系统需要在此结构的序列号字段中报告相同的值。 对于可能配置为单个系统或多个物理系统的机箱,即使机箱当前配置为单个系统,也会报告多系统机箱值。这允许管理应用程序识别机箱的多系统潜力。 |
二十六 | 1啊 | 紧凑型 PCI |
二十七 | 1B小时 | 高级三氯乙酸 |
二十八 | 1通道 | 刀片 刀片 的 SMBIOS 实现将包含用于单个刀片系统的 Type 3 机箱结构以及用于完成刀片系统的刀片机箱结构。 |
二十九 | 1小时 | 刀片机箱 刀片机箱是一种专用机箱,内含一组刀片。它为刀片组提供大量非核心计算基础设施(电源、冷却、网络等)。刀片机箱本身可以位于机架内,也可以是独立机箱。 |
三十 | 1Eh | 药片 |
31 | 1F小时 | 敞篷车 |
三十二 | 20 小时 | 可拆卸 |
33 | 21 小时 | 物联网网关 |
三十四 | 22 小时 | 嵌入式电脑 |
三十五 | 23 小时 | 迷你电脑 |
三十六 | 24 小时 | 棒式电脑 |
答案3
Debian解决方案:
要查找运行 Debian 的机器是否是笔记本电脑,请尝试:
[ -d /sys/module/battery ] && echo "Yes it's a laptop"
这种方法不需要root
特权。
然而,在其他发行版中,无论是否有电池,这个目录似乎都存在,至少以框架形式存在。从评论(如下)来看,这些发行版包括 CentOS、Ubuntu 和 Ubuntu 衍生的 Linux Mint 发行版。
更通用的解决方案
虽然它在我的 Debian 系统上不起作用,Alex 提出的解决方案据报道,该软件适用于 Ubuntu 和 CentOS。因此,为了更通用,建议采用一种可能的组合解决方案:
[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"
这种方法不需要root
特权。
更多细节
在装有实际电池的 Debian 系统上,该/sys/module/battery
目录包含许多文件。其中一个文件是/sys/module/battery/initstate
包含文本的文件live
。然而,在 Ubuntu 上,即使在实际的笔记本电脑上也不存在这些文件。因此,似乎可以使用该文件的存在/sys/module/battery/initstate
来测试运行 Debian 的笔记本电脑。
相比之下,在我测试的 Debian 系统上,该/proc/acpi/battery
目录不存在。
答案4
另一个不需要 sudo 的解决方案:
hostnamectl status | grep Chassis | cut -f2 -d ":" | tr -d ' '
将输出laptop
或desktop
。