以编程方式确定脚本是在笔记本电脑还是台式机上执行?

以编程方式确定脚本是在笔记本电脑还是台式机上执行?

是否有任何可靠的方法可以从 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 ' '

将输出laptopdesktop

相关内容