问题描述
我正在尝试测试python是否可以访问Mac上的核心文件。我用作示例的文件是bpf文件之一(我使用多个文件的原因是因为它将采用bpf0,bpf1,bpf2等格式)。我知道该文件存在。实际上,我知道有一个程序可以访问它并打开它,机场文件。这基本上是一个程序,它将测试wifi通道并将您的wifi卡置于监视模式。当我沿着dtrace运行它时,看看会发生什么,我将其作为回报:
8747/0x8431b: open("/dev/bpf\\0",0x2,0xFFFFFFFFFFFFFFFF) = -1 Err#2\
8747/0x8431b: open("/dev/bpf\\0",0x0,0xFFFFFFFFFFFFFFFF) = -1 Err#2\
8747/0x8431b: open("/dev/bpf0\\0",0x2) = -1 Err#16\
8747/0x8431b: open("/dev/bpf1\\0",0x2) = -1 Err#16\
8747/0x8431b: open("/dev/bpf2\\0",0x2) = 4 0\
因此bpf被尝试打开两次,均返回-1,错误代码为#2 尝试打开bpf0,但返回错误-1,错误代码#16 尝试打开bpf1,但返回错误-1,错误代码#16 bpf2已成功打开,并分配了值4,因此偏移量为0x4
此文件完成的操作:
8747/0x8431b: ioctl(0x4,0x40044271,0x7FFEEE9DAF10) = 0 0\
8747/0x8431b: ioctl(0x4,0xC004427F,0x7FEEAD008590) = 0 0\
8747/0x8431b: ioctl(0x4,0x40044266,0x7FFEEE9DAF1C) = 0 0\
8747/0x8431b: ioctl(0x4,0xC0044266,0x8020426C,0x7FFEEE9DB420) = 0 0\
8747/0x8431b: ioctl(0x4,0x4004426A,0xC00C4279,0x7FFEEE9DAEF0) = 0 0\
8747/0x8431b: ioctl(0x4,0x80044275,0x7FFEEE9DAF08) = 0 0\
8747/0x8431b: ioctl(0x4,0x20004269,0x0) = 0 0\
8747/0x8431b: ioctl(0x4,0x80104267,0x7FFEEE9DAEE0) = 0 0\
8747/0x8431b: ioctl(0x4,0x80044278,0x7FFEEE9DB4AC) = 0 0\
这基本上意味着处于sudo“状态”时,可以访问该文件。当我通过/ dev /文件夹运行os.webcrawler时,它还会返回该文件在那里:
for root,dirs,files in os.walk("/dev"):
for filename in files:
if filename.startswith('bpf'):
print('there')
print(filename)
there
bpf0
there
bpf1
there
bpf2
there
bpf3
there
bpf4
there
bpf5
但是,如果我运行命令os.path.isfile('/dev/bpf3')
或任何数字,它总是出现错误。我什至在命令行中转到dev位置,并使用了ls
命令,它出现了。即使我使用命令sudo python3
以sudo的身份在/ dev的命令行中以python形式启动python并键入os.path.isfile('/dev/bpf3')
,它也会出现错误。或者,如果我尝试使用模块shutil.copyfile('/dev/bpf4','bpf4')
复制文件,则会出现错误OSError: [Errno 22] Invalid argument
。我究竟做错了什么?我是否应该像机场一样首先尝试访问不带任何数字的bpf文件,但这毫无意义。
解决方法
作为提及的评论之一,This Link worked for me
具体来说,此功能在帖子中:
def exists(path):
"""Test whether a path exists. Returns False for broken symbolic links"""
try:
os.stat(path)
except OSError:
return False
return True
〜来自JVDM
我仍然不确定如何复制文件,并且能够检查它。如果有人知道,请告诉我。如果找到答案,我会发布它。