是否有可能得到知道它的serialnumber使用python pendrive挂载点?

我有两台PC(一个Linux和一个Windows)连接到不同楼层的本地networking。 在这个楼层的人们将他们的USB笔式驱动器连接到任一台PC上,我想把不同的特定文件复制给不同的人。

先前,

我所做的是如此艰苦(到地上去做手动)

后来我写了一个python程序,通过ssh我的决定复制到特定的人。 (即,我通过sshlogin到特定的机器,请求用户(通过电话)逐一插入他们的笔式驱动器,然后执行接受参数的python程序,这个参数不过是一个名字我想要复制的人,并通过接收参数程序决定哪些文件复制到笔式驱动器)。

不过这个过程有点乏味,因为只有一个笔式驱动器可以连接,而且我必须为每个用户重复这个操作。

所以为了减less总耗电量,我在两个系统上连接了USB集线器,以便在给定的时间内插入多个笔驱动器。 问题出在这里,决定哪个设备属于谁。

问题:是否可以使用python从SerialNumberfind笔驱动器的安装点? (这将是伟大的,如果它的Python,因为主程序是用Python编写的)

检索Windows和Linux的硬件信息

通过序列号识别CD-ROM

解压Linux序列号,不用sudo

如何从C ++程序获取Linux上的主板ID

获取Windows序列号(是:从registry中获取MachineGuid)

我正在考虑SerialNumber的原因,

UUID – 设备格式化时更改

Vendor , ProdID和Manufacturer – 不确定,如果他们会不同。 (即,如果它来自同一制造商和同一型号将会怎样)

我尝试了wmi的Windows ..并得到了这个代码从SO,(对不起,我没有链接,把它回来了很长时间)

import win32com.client wmi = win32com.client.GetObject ("winmgmts:") for usb in wmi.InstancesOf ("Win32_USBHub"): print usb.DeviceID

我得到的输出是

USBVID_5986&PID_02926&4817B6D&0&6 USBVID_8087&PID_00245&55D1EEC&0&1 USBVID_8087&PID_00245&88B8ABA&0&1 USBROOT_HUB204&11F77F7&0 USBROOT_HUB204&62BF53D&0 USBVID_03F0&PID_3307JN0W5LAB0ZHQ5VK8

它在Linux中类似的情况下,我所能得到的是serialnumber,使用usb-devices 。 但无法获得相应的挂载点

任何想法请…

WMI Win32_PhysicalMedia SerialNumber有时是hex的,有时是以相反的字节顺序

我如何唯一标识USB设备?

获取装载到/ dev文件夹的USB设备的唯一序列号

检索设备的serialno

如何获取C / C ++中的磁盘驱动器序列号

要在Linux上执行此操作,需要解析/proc/mounts以确定设备名称与挂载点的映射,即/dev/sdc2 – > /var/run/media/myaut/hyperx 。

诀窍是找出哪些设备名称需要序列号。 最简单的方法是使用udev – 在/dev/disk/by-id生成符号链接时使用串行:

/dev/disk/by-id/usb-Generic_Flash_Disk_12345678-0:0 -> ../../sdd

但是我们没有寻求最简单的解决方案,是吗? 诀窍是udev规则可能会改变, sysfs (来自内核)更可靠。 我实现了一个脚本来做到这一点:

import os import sys import glob SYS_USB_DEVICES = '/sys/bus/usb/devices' SYS_BLOCK_DEVICES = '/sys/class/block' try: serial = sys.argv[1] except IndexError: print >> sys.stderr,"Usage: findflash.py SERIAL" sys.exit(1) # PASS 1 Find USB node with corresponding to serial for usbid in os.listdir(SYS_USB_DEVICES): usbserpath = os.path.join(SYS_USB_DEVICES,usbid,'serial') if not os.path.exists(usbserpath): continue with open(usbserpath) as f: usb_serial = f.read().strip() if serial == usb_serial: # Found it! break else: print >> sys.stderr,"Cannot find usb device with serial {0}".format(serial) sys.exit(1) # Find SCSI ids corresponding to this device # I didn't check SYSFS documentation,but tested it on openSUSE 13.1 # The form of path is: # <SUBDEVICE>/host<SCSI_HOST_ID>/target<SCSI_TARGET_ID>/<CTRL><CHANNEL>:<TGT>:<LUN> # We need only basename devs = glob.glob(os.path.join(SYS_USB_DEVICES,'*/host*/target*/*:*:*:*')) devs = map(os.path.basename,devs) # PASS 2 - find mountpoints for devices with SCSI ids we discover earlier # Parse mountpoint formatted as "/dev/... /path/to/mntpt ..." def parse_mntpt(line): dev,mntpt,_ = line.split(None,2) dev = os.path.basename(dev) return dev,mntpt mntpts = {} with open('/proc/mounts') as f: mntpts = dict(map(parse_mntpt,f.readlines())) # List of ('scsi id','dev name','mnt pt (if exists)') devlist = [] def create_dev(scsiid,devname): global mntpts devlist.append((scsiid,devname,mntpts.get(devname))) for devname in os.listdir(SYS_BLOCK_DEVICES): devpath = os.path.join(SYS_BLOCK_DEVICES,devname) devlink = os.path.join(devpath,'device') # Node is "virtual",ie partition,ignore it if not os.path.islink(devlink): continue scsiid = os.path.basename(os.readlink(devlink)) if scsiid not in devs: continue create_dev(scsiid,devname) # Find partition names parts = glob.glob(os.path.join(devpath,'*/partition')) for partpath in parts: partname = os.path.basename(os.path.dirname(partpath)) create_dev(scsiid,partname) # END - print results fmtstr = '{0:8} {1:5} {2}' print fmtstr.format('SCSI ID','DEV','MOUNT POINT') for scsiid,mntpt in devlist: print fmtstr.format(scsiid,mntpt)

这里是输出示例:

$ python findflash.py 12345678 SCSI ID DEV MOUNT POINT 8:0:0:0 sdd None 8:0:0:0 sdd1 /var/run/media/myaut/Debian40wheezy4020140723-17:30 8:0:0:0 sdd2 None 8:0:0:0 sdd5 None 8:0:0:1 sr0 None

我不能说在Windows上很容易。 我有一个能够从系统中收集所有磁盘设备的代码(在C / WinAPI中),但是它的逻辑远离文件系统表示,所以我仍然没有找到解决方案。

Windows的复杂性来自:

有一组函数,如SetupDi *,允许枚举磁盘设备。 他们的名字是PnP风格,与卷名无关。

有DOS风格的API(即工作在A级和C

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐