为什么os.access会给出错误的负面结果?

r7s23pms  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(435)

我对以下代码有问题

import os
print("Can I write into the tv folder?",os.access("/tv", os.W_OK))
print("Does the /tv/test file exists?", os.access("/tv/test", os.R_OK))
with open("/tv/test", "w") as f:
    f.write("toto")
print("Does the /tv/test file exists now?", os.access("/tv/test", os.R_OK))
with open("/tv/test", "r") as f:
    print("Content of the /tv/test file:")
    print(f.read())

它打印出来了

Can I write into the tv folder? False
Does the /tv/test file exists? False
Does the /tv/test file exists now? True
Content of the /tv/test file;
toto

但是根据第一次打电话给 os.access ,我不应该写测试文件。。。
我在docker容器(docker版本20.10.7)中运行python 3.8.10,tv文件夹是docker完成的远程nfs装载。

root@7f0a44aad8a9:/# ls -la /tv
total 8
drwxrwxrwx 1 abc  abc   3826 Jul 27 14:18  .
drwxr-xr-x 1 root root  4096 Jul 27 14:12  ..
drwxrwxrwx 1 abc  abc    988 May 13 07:30 DARK
... (a lot of other folders)
-rwxrwxrwx 1 abc  abc      4 Jul 27 14:18  test

我的docker撰写文件:

version: "3.4"

services:
  bazarr:
    image: ghcr.io/linuxserver/bazarr
    container_name: bazarr
    volumes:
      - shows:/tv
    ports:
      - 6767:6767
    dns: 1.1.1.1
    restart: unless-stopped

volumes:
  shows:
    driver_opts:
      type: "nfs"
      o: "nfsvers=3,addr=xxx,soft,rw"
      device: ":xxx"

我知道 os.access 可以给假阳性,但假阴性?
有人看过这个吗?
这是意料之中的事吗?

vwkv1x7d

vwkv1x7d1#

这与posix文件系统(包括*nix文件系统)的关系要比与python的关系大得多。
但是根据对os.access的第一次调用,我不应该能够编写测试文件。。。
不,不幸的是,这是错误的(但必须承认,这有点不直观)。
在posix文件系统中,您可能没有写入目录的权限(这是您所检查的),但这并不意味着您不能写入该目录中的文件。这意味着您不能将新文件写入所述目录。
例子:

(base) mmessersmith@HP-ZBK-0425:~$ mkdir test_dir
(base) mmessersmith@HP-ZBK-0425:~$ touch test_dir/abc.txt
(base) mmessersmith@HP-ZBK-0425:~$ cat test_dir/abc.txt
(base) mmessersmith@HP-ZBK-0425:~$ chmod 777 test_dir/abc.txt
(base) mmessersmith@HP-ZBK-0425:~$ chmod 500 test_dir
(base) mmessersmith@HP-ZBK-0425:~$ touch test_dir/new_file.txt
touch: cannot touch 'test_dir/new_file.txt': Permission denied
(base) mmessersmith@HP-ZBK-0425:~$ echo "123" > test_dir/abc.txt
(base) mmessersmith@HP-ZBK-0425:~$ cat test_dir/abc.txt
123
(base) mmessersmith@HP-ZBK-0425:~$ ls -al test_dir/
total 12
dr-x------  2 mmessersmith mmessersmith 4096 Jul 27 09:32 .
drwxr-xr-x 24 mmessersmith mmessersmith 4096 Jul 27 09:31 ..
-rwxrwxrwx  1 mmessersmith mmessersmith    4 Jul 27 09:32 abc.txt

请注意,我无法将新文件写入目录 test_dir ,但我仍然可以写信给 .txt 在内部 test_dir . 在上面的示例中,您需要检查 os.access("/tv/test", os.W_OK) . 在上述示例的我的回复中:

(base) mmessersmith@HP-ZBK-0425:~$ python
Python 3.8.3 (default, May 19 2020, 18:47:26)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.access('test_dir', os.W_OK)
False
>>> os.access('test_dir/abc.txt', os.R_OK)
True
>>> os.access('test_dir/abc.txt', os.W_OK)
True

最后,请注意 os.access 是linux/unix访问的简单 Package 器:https://manpages.debian.org/buster/manpages-dev/access.2.en.html.
所以不,这不是假阳性或假阴性,这只是文件系统的工作方式。

相关问题