os.path是否可以返回需要root访问权限的文件



我正在测试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, 0x2)       = -1 Err#16
8747/0x8431b:  open("/dev/bpf1\0", 0x2, 0x2)       = -1 Err#16
8747/0x8431b:  open("/dev/bpf2\0", 0x2, 0x2)       = 4 0

因此,bpf被尝试打开两次,都返回了-1,错误代码为#2试图打开bpf0,但返回错误-1,错误代码为#16试图打开bpf1,但返回错误-1,错误代码为#16bpf2被成功打开,并被赋值为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, 0x7FFEEE9DAF1C)       = 0 0
8747/0x8431b:  ioctl(0x4, 0x8020426C, 0x7FFEEE9DB420)       = 0 0
8747/0x8431b:  ioctl(0x4, 0x4004426A, 0x7FFEEE9DAF1C)       = 0 0
8747/0x8431b:  ioctl(0x4, 0xC00C4279, 0x7FFEEE9DAEF0)       = 0 0
8747/0x8431b:  ioctl(0x4, 0xC00C4279, 0x7FFEEE9DAEF0)       = 0 0
8747/0x8431b:  ioctl(0x4, 0x80044275, 0x7FFEEE9DAF08)       = 0 0
8747/0x8431b:  ioctl(0x4, 0x20004269, 0x0)      = 0 0
8747/0x8431b:  ioctl(0x4, 0x40044266, 0x7FFEEE9DAF1C)       = 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')或任何数字,它总是出现false。我甚至去了命令行中的dev位置,使用了ls命令,它就出现了。即使我在命令行/dev/sudo中用命令sudo python3启动python并键入os.path.isfile('/dev/bpf3'),它也会出现false。或者,如果我尝试用模块shutil.copyfile('/dev/bpf4', 'bpf4')复制文件,它会出现错误OSError: [Errno 22] Invalid argument。我做错了什么?我是不是应该像机场那样,先尝试访问没有任何号码的bpf文件,但这毫无意义。

作为提到的评论之一,该链接对我有效

具体来说,这个功能在帖子中:

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

我仍然不确定我将如何复制文件,我将能够检查它。如果有人知道,请告诉我。如果我找到答案,我会把它贴出来。

最新更新