Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法让python包psutil在Debian/Ubuntu和OSX上检测卸载的设备

有没有办法让python包psutil在Debian/Ubuntu和OSX上检测卸载的设备
EN

Stack Overflow用户
提问于 2017-10-09 00:21:46
回答 2查看 1.2K关注 0票数 0

我正在编写一个python脚本,它使用psutil包来检测USB设备何时插入计算机。但是,我还想检测设备是否已插入但未挂载。

我正在阅读文档,并假设像current_state = psutil.disk_partitions(all=True)这样的东西会做类似这样的事情,但是经过进一步的检查,似乎并非如此。

有没有其他方法可以让psutil检测未挂载的设备?如果失败,是否有系统不可知的方式/包来检测设备是否已插入但未挂载?

EN

回答 2

Stack Overflow用户

发布于 2017-10-09 01:13:21

列出未挂载的块设备依赖于操作系统:这样做的机制在MacOS和Linux之间并不常见,而且目前,psutil库没有在这些差异上实现抽象层。

列出Linux上的所有块设备

以下迭代器将生成Linux上的块设备列表,不包括那些具有分区的块设备(对于这些分区,您可能只想检查分区本身是否已挂载),以便可以将结果与挂载到挂载点的设备列表进行比较:

代码语言:javascript
运行
AI代码解释
复制
import glob

def linux_block_devices():
    for blockdev_stat in glob.glob('/sys/block/*/stat'):
        blockdev_dir = blockdev_stat.rsplit('/', 1)[0]
        found_parts = False
        for part_stat in glob.glob(blockdev_dir + '/*/stat'):
            yield blockdev_stat.rsplit('/', 2)[-2]
            found_parts = True
        if not found_parts:
            yield blockdev_dir.rsplit('/', 1)[-1]

列出MacOS上的所有数据块设备

在MacOS上,我不知道有一个面向编程用途的接口暴露给Python --您可能最终解析命令行输出,如下所示:

代码语言:javascript
运行
AI代码解释
复制
import subprocess, re

def mac_block_devices():
    output = subprocess.check_output(['diskutil', 'list'])
    return re.findall('^\s+\d+:.*\s(disk\S*)$', output, flags=re.MULTILINE)

...this one更粗糙,因为它不排除有孩子的设备;把这当作是读者的练习。

将以上任一项与psutil结合使用

代码语言:javascript
运行
AI代码解释
复制
import os, psutil

all_block_devices = set(
  linux_block_devices() if os.path.exists('/sys') else mac_block_devices()
)
used_block_devices = set(
    (p.device.replace('/dev/', '') for p in psutil.disk_partitions())
)
unused_block_devices = all_block_devices - used_block_devices

上面的代码将为您提供任一操作系统上未使用的块设备的列表--类似于MacOS上的set(['sdb1', 'sdc1']) on Linux, or set(['disk3', 'disk4s1'])

请注意,这是“未使用”的意思,即“未在挂载表中使用”。在挂载表中不存在块设备的情况下,还有其他几种方法可以使用(应用程序代码直接原始访问;使用交换分区;存在于设备映射器或逻辑卷机制的后备中;等等),检测所有这些都需要对任一操作系统进行大量连接。

票数 1
EN

Stack Overflow用户

发布于 2018-05-04 04:12:44

我最近在OSX上解决了这个问题,也可能在*nix上(等待进一步的测试)使用hidapi。下面是我如何使用它的一个示例:

代码语言:javascript
运行
AI代码解释
复制
import hid
import pprint

hid_state = hid.enumerate()
pprint.pprint(hid_state)

输出如下:

代码语言:javascript
运行
AI代码解释
复制
[ {'interface_number': -1,
'manufacturer_string': 'Apple Inc.',
'path':     b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
          b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
          b'400000/Apple Internal Keyboard@0/AppleUSBTCKeyboard@14400000,0',
  'product_id': 610,
  'product_string': 'Apple Internal Keyboard / Trackpad',
  'release_number': 549,
  'serial_number': '',
  'usage': 6,
  'usage_page': 1,
  'vendor_id': 1452},
 {'interface_number': -1,
  'manufacturer_string': 'Apple Inc.',
  'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
          b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
          b'400000/Touchpad@1/AppleUSBMultitouchDriver@14400000,1',
  'product_id': 610,
  'product_string': 'Apple Internal Keyboard / Trackpad',
  'release_number': 549,
  'serial_number': '',
  'usage': 1,
  'usage_page': 65280,
  'vendor_id': 1452},
 {'interface_number': -1,
  'manufacturer_string': 'Apple Inc.',
  'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
          b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
          b'400000/Touchpad@2/AppleUSBTCButtons@14400000,2',
  'product_id': 610,
  'product_string': 'Apple Internal Keyboard / Trackpad',
  'release_number': 549,
  'serial_number': '',
  'usage': 2,
  'usage_page': 1,
  'vendor_id': 1452},
 {'interface_number': -1,
  'manufacturer_string': '',
  'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/'
          b'IOPP/UPSB@0/IOPP/DSB1@3/IOPP/UPS0@0/IOPP/pci-bridge@0/IOPP/pci1b'
          b'73,1100@0/AppleUSBXHCIFL1100@00000000/AppleUSB20XHCIPort@0040000'
          b'0/USB Keyboard@00400000/IOUSBHostInterface@1/IOUSBHostHIDDevice@'
          b'00400000,1',
  'product_id': 617,
  'product_string': 'USB Keyboard',
  'release_number': 4368,
  'serial_number': '',
  'usage': 1,
  'usage_page': 12,
  'vendor_id': 1241},
 {'interface_number': -1,
  'manufacturer_string': '',
  'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/HDEF@1B/A'
          b'ppleHDAController@1B/IOHDACodecDevice@1B,0/IOHDACodecDriver/IOHD'
          b'ACodecFunction@1B,0,1/AppleHDACodecGeneric/AppleHDADriver/AppleM'
          b'ikeyHIDDriver',
  'product_id': 0,
  'product_string': 'Apple Mikey HID Driver',
  'release_number': 0,
  'serial_number': '',
  'usage': 1,
  'usage_page': 12,
  'vendor_id': 0}]

为简洁起见,此示例已简化,但面临的一个问题是同一设备的多个条目,其中仅路径略有不同,示例如下所示:

代码语言:javascript
运行
AI代码解释
复制
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
b'400000/Touchpad@2/AppleUSBTCButtons@14400000,2',

代码语言:javascript
运行
AI代码解释
复制
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
b'400000/Apple Internal Keyboard@0/AppleUSBTCKeyboard@14400000,0',

我能够通过使用路径值减去最后一个字符对字典列表进行排序来删除这些重复项(因为许多只以不同的",number“结尾),如下所示:

代码语言:javascript
运行
AI代码解释
复制
list({str(v['path'][:-2]): v for v in r}.values())

正如我已经提到的,我仍然需要在*nix上做测试,然而,我可以说它在识别OSX上的鼠标和键盘等HID设备方面做得很好,我需要确定它是否能够识别恶意HID设备,如USB Rubber Duckies,但迹象看起来很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46637328

复制
相关文章
在Debian和Ubuntu上使用Apache的SSL证书
本指南将向您展示如何在Debian和Ubuntu系统上启用SSL来确保通过Apache部署的网站的安全。原文地址
Noel
2018/09/03
2.2K0
在Debian和Ubuntu上使用SFTP Jails限制访问
作为您的Linode的系统管理员,您可能希望让您的用户能够安全地将文件上传到您的服务器。最常见的方法是允许通过使用SSH提供加密的安全文件传输协议(SFTP)进行文件传输,这要求您为用户提供SSH登录。但是,默认情况下,SSH用户可以查看您的Linode的整个文件系统,这可能是不可取的。
Aurora47
2018/09/05
2.5K0
在Debian和Ubuntu上使用SFTP Jails限制访问
Debian 和Ubuntu Mono 3.0 部署包
Mono 3.0 刚发布,Debian 的Mono打包工作也开始了, 这篇博客《Mono 3.0 Preview Packages for Debian and Ubuntu 》讲述了Debian 和Ubuntu Mono 3.0 部署包的制作和最新的更新,目前最新的支持到Mono 3.0.6,目前还是在beta阶段,不用把它用于生产环境。 在/etc/apt/sources.list 文件里增加一行: deb http://debian.meebey.net/experimental/mono / 更新
张善友
2018/01/30
5660
Bashtop:一款功能强大的LinuxOSXFreeBSD资源监控工具
Bashtop是一款针对Linux/OSX/FreeBSD的基于终端的资源监控实用程序,虽然该工具是一个命令行工具,但它也提供了非常美观的UI界面,并且可以直观地显示CPU、内存、正在运行的进程和带宽等统计数据。它带有游戏风格的响应式终端UI和可自定义的菜单,各种显示部分的整齐排列使监视各种系统指标变得容易了很多。
FB客服
2020/10/27
2.2K0
Bashtop:一款功能强大的LinuxOSXFreeBSD资源监控工具
在OSX上安装和使用ROS
参考链接:https://github.com/mikepurvis/ros-install-osx
zhangrelay
2022/04/29
1K0
在OSX上安装和使用ROS
在Debian和Ubuntu上安装Ghost(CMS)博客发布平台
Ghost是一个免费的开源和轻量级平台,用于博客或在线出版物。 它是在Nodejs中编写的, 并附有各种各样的现代出版工具,用于轻松构建和运行在线出版物。
子润先生
2021/06/15
1.5K0
在Debian和Ubuntu上安装军团要塞2服务器
Team Fortress 2是一支以团队为基础的第一人称射击游戏,您和其他玩家可以在这里组成团队玩各种游戏模式。从争夺国旗到与你的团队一起对抗机器人部落的战斗等等,有许多游戏模式可供选择。配置个人游戏服务器可让您控制所使用的游戏模式和地图,以及各种其他设置以自定义您的游戏体验。
魔法少女伊莉雅
2018/09/06
2.1K0
在Debian和Ubuntu上安装军团要塞2服务器
在Ubuntu 16.04或Debian 8上安装SquirrelMail
SquirrelMail是一个用PHP编写的webmail包,它支持SMTP和IMAP协议,并具有跨平台兼容性。SquirrelMail需要一台带有PHP的Web服务器才能正常运行。对于本指南,我们将使用Apache 2.如果您还没有安装Apache和PHP,可以在Ubuntu 16.04安装LAMP或Debian 8 安装LAMP查看我们的安装指南。
Likenttt
2018/09/12
2K0
在Ubuntu 16.04或Debian 8上安装SquirrelMail
psutil包
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131922.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/30
5511
在Ubuntu或Debian上更新并保护Drupal 8
Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。Drupal是一套开源系统,全球数以万计的WEB开发专家都在为Drupal技术社区贡献代码。因此,Drupal的代码在安全性、健壮性上具有世界最高水平。截止2011年底,共有13,802位WEB专家参加了Drupal的开发工作;228个国家使用181种语言的729,791位网站设计工作者使用Drupal。著名案例包括:联合国、美国白宫、美国商务部、纽约时报、华纳、迪斯尼、联邦快递、索尼、美国哈佛大学、Ubuntu等。Drupal 8是流行的Drupal内容管理系统的最新版本。虽然版本8.1中包含简单的增量更新功能,但所有先前版本都需要手动核心更新。本教程演示了如何在Linode上手动安装增量Drupal 8更新。本教程假设您已在Apache和Debian或Ubuntu上运行了功能强大的Drupal 8安装。
陈树丶
2018/08/20
1.3K0
如何在Ubuntu和Debian上安装R.
R是包含了数据可视化功能的用于统计分析的编程语言。该语言通过Comprehensive R Archive Network(CRAN)拥有高度的可扩展性,该网络托管了10,000多个R包,用于生成出版数据,专用计算工具等。
魔法少女伊莉雅
2018/09/04
1.9K0
在Ubuntu上挂载Windows分区的解决办法
 在我和实际使用中,字符集用utf8效果很好,没有出现乱码的问题,在终端挂载的代码如下: mount -t vfat /dev/hda2 /mnt/d -o codepage=936,iocharset=utf8 我的fstab # /etc/fstab: static file system information. # # <file system> <mount point>   <type>  <options>       <dump>  <pass> proc            /proc           proc    defaults        0       0 /dev/hdc8       /               ext3    defaults,errors=remount-ro 0       1 /dev/hdc9       none            swap    sw              0       0 /dev/hdb        /media/cdrom0   udf,iso9660 user,noauto     0       0 /dev/hdc1       /mnt/winc     vfat    defaults,codepage=936,iocharset=utf8  0  0 /dev/hdc5       /mnt/wind    ntfs    defaults,iocharset=utf8,umask=0222   0  0 /dev/hdc6       /mnt/wine    ntfs    defaults,iocharset=utf8,umask=0222   0  0 /dev/hdc7       /mnt/winf    vfat    defaults,codepage=936,iocharset=utf8  0   0 (以下转自网络) 1、挂载点必须是一个目录。 2、一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内 容将不可用。 对于其他操作系统建立的文件系统的挂载也是这样。但是需要理解的是:光盘、软盘、其他操作 系统使用的文件系统的格式与linux使用的文件系统格式是不一样的。光盘是ISO9660;软盘是 fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和 windowsXP是fat16、fat32、NTFS。挂载前要了解linux是否支持所要挂载的文件系统格式。 挂载时使用mount命令: 格式:mount [-参数] [设备名称] [挂载点] 其中常用的参数有 -t<文件系统类型> 指定设备的文件系统类型,常见的有: minix linux最早使用的文件系统 ext2 linux目前常用的文件系统 msdos MS-DOS的fat,就是fat16 vfat windows98常用的fat32 nfs 网络文件系统 iso9660 CD-ROM光盘标准文件系统 ntfs windows NT 2000的文件系统 hpfs OS/2文件系统 auto 自动检测文件系统 -o<选项> 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。常用的有 codepage=XXX 代码页 iocharset=XXX 字符集 ro 以只读方式挂载 rw 以读写方式挂载 nouser 使一般用户无法挂载 user 可以让一般用户挂载设备 提醒一下,mount命令没有建立挂载点的功能,因此你应该确保执行mount命令时,挂载点已经存 在。(不懂?说白了点就是你要把文件系统挂载到哪,首先要先建上个目录。这样OK?) 例子:windows98装在hda1分区,同时计算机上还有软盘和光盘需要挂载。 # mk /mnt/winc # mk /mnt/floppy # mk /mnt/cdrom # mount -t vfat /dev/hda1 /mnt/winc # mount -t msdos /dev/fd0 /mnt/floppy # mount -t iso9660 /dev/cdrom /mnt/cdrom 现在就可以进入/mnt/winc等目录读写这些文件系统了。 要保证最后两行的命令不出错,要确保软驱和光驱里有盘。(要是硬盘的磁盘片也可以经常随时 更换的话,我想就不会犯这样的错误了 :-> ) 如果你的windows98目录里有中文文件名,使用上面的命令挂载后,显示的是一堆乱码。这就要 用到 -o 参数里的codepage iocharset选项。codepage指定文件系统的代码页,简体中文中文代 码是936;io
王亚昌
2018/08/03
3.1K0
python psutil
psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。
孙杰
2019/10/29
7530
python psutil替代_python psutil
1 psutil.cpu_percent(interval,percpu) #返回CPU利用率
全栈程序员站长
2022/09/06
4430
在 Debian Linux 上设置和配置网桥
如何你想为你的虚拟机分配 IP 地址并使其可从你的局域网访问,则需要设置网络桥接器。默认情况下,虚拟机使用 KVM 创建的专用网桥。但你需要手动设置接口,避免与网络管理员发生冲突。
用户8989785
2021/09/10
5.5K0
在Debian 7上安装和配置OSSEC
OSSEC是一个开源的,基于主机的入侵检测系统(HIDS),可执行日志分析,完整性检查,rootkit检测,基于时间的警报和主动响应,使其成为服务器监控的理想选择。
沈唁
2018/09/20
1.6K0
卸载python最干净的办法
首先打开命令行 查看当前使用的python版本 然后就去官网下载对应的版本(下载可执行安装文件) 下载完成后打开该文件 选择卸载python 然后就坐等卸载完成就OK了
py3study
2020/01/06
2.5K1
在Debian 7.4上安装和配置ownCloud
ownCloud是一个开源的私有云平台,访问文件轻松方便,不受位置和平台限制。ownCloud的兼容性也很不错,大多数主流的PC操作系统,还有移动端设备都能很好的兼容。
Techeek
2018/09/12
1.2K0
在Debian 7.4上安装和配置ownCloud
Ubuntu卸载python(慎重)
Ubuntu系统下不要轻易卸载系统自带的python(2.7、3.5),因为Ubuntu依赖python环境。
全栈程序员站长
2022/09/02
2.5K0
ubuntu上docker卸载重装[通俗易懂]
docker rmi $(docker images | grep “^” | awk “{print $3}”)
全栈程序员站长
2022/10/03
3.1K0

相似问题

在OSX上为Python安装psutil图书馆员

11

有没有办法让python脚本在ubuntu服务器上运行?

17

Debian包卸载过程

13

有没有办法让vi和vim在OSX上有不同的表现?

21

有没有办法在Azure functions Startup上运行和部署ubuntu包?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档