Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục


Bạn có thể sử dụng OS.Access (đường dẫn, chế độ) để kiểm tra quyền thư mục với các chế độ để đọc, viết và thực thi quyền. Để có thể viết, bạn cũng cần phải kiểm tra quyền thực thi. Ví dụ,

>>> import os
>>> os.access('my_folder', os.R_OK) # Check for read access
True
>>> os.access('my_folder', os.W_OK) # Check for write access
True
>>> os.access('my_folder', os.X_OK) # Check for execution access
True
>>> os.access('my_folder', os.X_OK | ox.W_OK) # Check if we can write file to the directory
True

Bạn cũng có thể làm theo một thành ngữ Python phổ biến: dễ dàng yêu cầu sự tha thứ hơn là cho phép. Theo thành ngữ đó, bạn nên thử viết vào thư mục được đề cập và bắt lỗi nếu bạn không có quyền làm như vậy.

Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục

Cập nhật vào ngày 03 tháng 10 năm 2019 05:39:04

  • Câu hỏi và câu trả lời liên quan
  • Làm thế nào để kiểm tra quyền của một tệp bằng Python?
  • Làm thế nào để thay đổi quyền của người dùng và nhóm cho một thư mục bằng Python?
  • Làm thế nào để thay đổi sự cho phép của một thư mục bằng Python?
  • Làm thế nào để thay đổi chủ sở hữu của một thư mục bằng Python?
  • Làm thế nào để tạo một thư mục bằng Python?
  • Làm thế nào để xóa một thư mục bằng Python?
  • Làm thế nào để kiểm tra xem một thư mục nhất định có chứa bất kỳ thư mục nào khác trong Python không?
  • Làm thế nào để tạo một kho lưu trữ zip của một thư mục bằng Python?
  • Làm thế nào để tính toán kích thước thư mục bằng Python?
  • Làm thế nào để tạo một thư mục một cách đệ quy bằng cách sử dụng Python?
  • Làm thế nào để xóa một thư mục một cách đệ quy bằng cách sử dụng Python?
  • Làm thế nào để đổi tên thư mục bằng Python?
  • Làm thế nào để sao chép quyền NTFS bằng PowerShell?
  • Làm thế nào để thay đổi quyền tệp trong Python?
  • Làm thế nào để tạo một tên thư mục độc đáo bằng Python?

Điều gì sẽ là cách tốt nhất trong Python để xác định xem một thư mục có thể ghi được cho người dùng thực thi tập lệnh không? Vì điều này có thể sẽ liên quan đến việc sử dụng mô -đun HĐH nên tôi nên đề cập đến việc tôi đang chạy nó theo môi trường *nix.

Hỏi ngày 21 tháng 1 năm 2010 lúc 22:24Jan 21, 2010 at 22:24

IlluminedTigerilluminedtigerilluminatedtiger

1.4913 huy hiệu vàng12 Huy hiệu bạc8 Huy hiệu đồng3 gold badges12 silver badges8 bronze badges

Mặc dù những gì Christophe đề xuất là một giải pháp pythonic hơn, mô -đun HĐH có chức năng OS.Access để kiểm tra quyền truy cập:

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
1 # w_ok là để viết, r_ok để đọc, v.v.

Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục

Đã trả lời ngày 21 tháng 1 năm 2010 lúc 22:39Jan 21, 2010 at 22:39

Max Shawabkehmax ShawabkehMax Shawabkeh

36,9k9 Huy hiệu vàng81 Huy hiệu bạc91 Huy hiệu Đồng9 gold badges81 silver badges91 bronze badges

7

Nó có vẻ lạ khi đề xuất điều này, nhưng một thành ngữ Python phổ biến là

Yêu cầu tha thứ dễ dàng hơn là cho phép

Theo thành ngữ đó, người ta có thể nói:

Hãy thử viết vào thư mục trong câu hỏi và bắt lỗi nếu bạn không có quyền làm như vậy.

sschilli

1.8731 Huy hiệu vàng11 Huy hiệu bạc31 Huy hiệu đồng1 gold badge11 silver badges31 bronze badges

Đã trả lời ngày 21 tháng 1 năm 2010 lúc 22:30Jan 21, 2010 at 22:30

ChristophedchristophedChristopheD

109K27 Huy hiệu vàng160 Huy hiệu bạc177 Huy hiệu đồng27 gold badges160 silver badges177 bronze badges

10

Giải pháp của tôi bằng cách sử dụng mô -đun

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
2:

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True

CẬP NHẬT: Sau khi kiểm tra lại mã trên Windows, tôi thấy rằng thực sự có vấn đề khi sử dụng TempFile ở đó, hãy xem Vấn đề22107: Mô -đun TempFile diễn giải sai Lỗi bị từ chối trên Windows. Trong trường hợp của một thư mục không chiến đấu, mã treo trong vài giây và cuối cùng ném một

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
3. Có lẽ đây là những gì User2171842 đã quan sát? Thật không may, vấn đề hiện không được giải quyết vì vậy để xử lý vấn đề này, lỗi cũng cần phải bị bắt:

    except (OSError, IOError) as e:
        if e.errno == errno.EACCES or e.errno == errno.EEXIST:  # 13, 17

Sự chậm trễ tất nhiên vẫn còn trong những trường hợp này.

Kawu

13.4K33 Huy hiệu vàng118 Huy hiệu bạc193 Huy hiệu đồng33 gold badges118 silver badges193 bronze badges

Đã trả lời ngày 16 tháng 9 năm 2014 lúc 12:30Sep 16, 2014 at 12:30

3

Tình cờ tìm thấy chủ đề này để tìm kiếm các ví dụ cho ai đó. Kết quả đầu tiên trên Google, chúc mừng!

Mọi người nói về cách làm pythonic trong chủ đề này, nhưng không có ví dụ mã đơn giản? Bạn đi đây, cho bất kỳ ai khác vấp ngã:

import sys

filepath = 'C:\\path\\to\\your\\file.txt'

try:
    filehandle = open( filepath, 'w' )
except IOError:
    sys.exit( 'Unable to write to file ' + filepath )

filehandle.write("I am writing this text to the file\n")

Điều này cố gắng mở một fileHandle để viết và thoát ra với lỗi nếu tệp được chỉ định không thể được ghi vào: Điều này dễ đọc hơn và là một cách tốt hơn nhiều , vì nó tránh được điều kiện chủng tộc; Các trường hợp trong đó tệp trở nên không thể biết được giữa thời gian bạn chạy precheck và khi bạn thực sự cố gắng ghi vào tệp.

Đã trả lời ngày 23 tháng 6 năm 2012 lúc 13:52Jun 23, 2012 at 13:52

RohaqrohaqRohaq

1.8261 Huy hiệu vàng15 Huy hiệu bạc22 Huy hiệu đồng1 gold badge15 silver badges22 bronze badges

5

Nếu bạn chỉ quan tâm đến các perms tệp,

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
4 nên làm những gì bạn yêu cầu. Thay vào đó, nếu bạn muốn biết liệu bạn có thể ghi vào thư mục hay không,
import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
5 một tệp kiểm tra để viết (nó không tồn tại trước), bắt và kiểm tra bất kỳ
import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
6 nào và làm sạch tệp kiểm tra sau đó.can write to the directory,
import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
5 a test file for writing (it shouldn't exist beforehand), catch and examine any
import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
6, and clean up the test file afterwards.

Tổng quát hơn, để tránh các cuộc tấn công của Toctou (chỉ là vấn đề nếu tập lệnh của bạn chạy với các đặc quyền cao-SUID hoặc CGI hoặc hơn), bạn không nên thực sự tin tưởng các bài kiểm tra trước thời gian này, nhưng bỏ các tư nhân, thực hiện

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
5 và Mong đợi
import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
6.

Đã trả lời ngày 21 tháng 1 năm 2010 lúc 23:17Jan 21, 2010 at 23:17

Sverkerwsverkerwsverkerw

4912 Huy hiệu bạc6 Huy hiệu đồng2 silver badges6 bronze badges

Kiểm tra các bit chế độ:

import os, stat

def isWritable(dirname):
  uid = os.geteuid()
  gid = os.getegid()
  s = os.stat(dirname)
  mode = s[stat.ST_MODE]
  return (
     ((s[stat.ST_UID] == uid) and (mode & stat.S_IWUSR)) or
     ((s[stat.ST_GID] == gid) and (mode & stat.S_IWGRP)) or
     (mode & stat.S_IWOTH)
     )

Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục

Biogeek

21.4K21 Huy hiệu vàng81 Huy hiệu bạc140 Huy hiệu đồng21 gold badges81 silver badges140 bronze badges

Đã trả lời ngày 21 tháng 1 năm 2010 lúc 22:32Jan 21, 2010 at 22:32

Joe Kobergjoe KobergJoe Koberg

24.5k6 Huy hiệu vàng47 Huy hiệu bạc52 Huy hiệu Đồng6 gold badges47 silver badges52 bronze badges

1

Đây là một cái gì đó tôi đã tạo ra dựa trên câu trả lời của Christophed:

import os

def isWritable(directory):
    try:
        tmp_prefix = "write_tester";
        count = 0
        filename = os.path.join(directory, tmp_prefix)
        while(os.path.exists(filename)):
            filename = "{}.{}".format(os.path.join(directory, tmp_prefix),count)
            count = count + 1
        f = open(filename,"w")
        f.close()
        os.remove(filename)
        return True
    except Exception as e:
        #print "{}".format(e)
        return False

directory = "c:\\"
if (isWritable(directory)):
    print "directory is writable"
else:
    print "directory is not writable"

Đã trả lời ngày 23 tháng 12 năm 2011 lúc 20:43Dec 23, 2011 at 20:43

Khattamkhattamkhattam

1.1741 Huy hiệu vàng8 Huy hiệu bạc14 Huy hiệu đồng1 gold badge8 silver badges14 bronze badges

1

 if os.access(path_to_folder, os.W_OK) is not True:
            print("Folder not writable")
 else :
            print("Folder writable")

Thông tin thêm về truy cập có thể tìm thấy nó ở đây

Đã trả lời ngày 16 tháng 5 năm 2017 lúc 15:30May 16, 2017 at 15:30

Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục

SoftMixTsoftMixtSoftmixt

1.58819 huy hiệu bạc20 Huy hiệu đồng19 silver badges20 bronze badges

1

Tôi đã gặp phải nhu cầu tương tự trong khi thêm một đối số thông qua Argparse. Được xây dựng trong

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
9 sẽ không hoạt động với tôi vì tôi đang tìm kiếm một thư mục. Cuối cùng tôi đã viết phương pháp của riêng mình để giải quyết vấn đề của mình. Đây là kết quả với đoạn trích Argparse.

#! /usr/bin/env python
import os
import argparse

def writable_dir(dir):
    if os.access(dir, os.W_OK) and os.path.isdir(dir):
        return os.path.abspath(dir)
    else:
        raise argparse.ArgumentTypeError(dir + " is not writable or does not exist.")

parser = argparse.ArgumentParser()
parser.add_argument("-d","--dir", type=writable_dir, default='/tmp/',
    help="Directory to use. Default: /tmp")
opts = parser.parse_args()

Kết quả sau:

$ python dir-test.py -h
usage: dir-test.py [-h] [-d DIR]

optional arguments:
  -h, --help         show this help message and exit
  -d DIR, --dir DIR  Directory to use. Default: /tmp

$ python dir-test.py -d /not/real
usage: dir-test.py [-h] [-d DIR]
dir-test.py: error: argument -d/--dir: /not/real is not writable or does not exist.

$ python dir-test.py -d ~

Tôi đã quay lại và thêm in opts.dir vào cuối, và mọi thứ dường như hoạt động như mong muốn.print opts.dir to the end, and everything appears to be functioning as desired.

Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục

Bmacnaughton

4.7003 huy hiệu vàng25 Huy hiệu bạc34 Huy hiệu đồng3 gold badges25 silver badges34 bronze badges

Đã trả lời ngày 6 tháng 10 năm 2018 lúc 4:07Oct 6, 2018 at 4:07

Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục

Nếu bạn cần kiểm tra sự cho phép của người dùng khác (vâng, tôi nhận ra điều này mâu thuẫn với câu hỏi, nhưng có thể có ích cho ai đó), bạn có thể thực hiện thông qua mô -đun

    except (OSError, IOError) as e:
        if e.errno == errno.EACCES or e.errno == errno.EEXIST:  # 13, 17
0 và các bit của Chế độ thư mục.another user (yes, I realize this contradicts the question, but may come in handy for someone), you can do it through the
    except (OSError, IOError) as e:
        if e.errno == errno.EACCES or e.errno == errno.EEXIST:  # 13, 17
0 module, and the directory's mode bits.

Tuyên bố miễn trừ trách nhiệm - không hoạt động trên Windows, vì nó không sử dụng mô hình quyền POSIX (và mô -đun

    except (OSError, IOError) as e:
        if e.errno == errno.EACCES or e.errno == errno.EEXIST:  # 13, 17
0 không có sẵn ở đó), ví dụ: - Chỉ giải pháp cho các hệ thống *NIX. - does not work on Windows, as it doesn't use the POSIX permissions model (and the
    except (OSError, IOError) as e:
        if e.errno == errno.EACCES or e.errno == errno.EEXIST:  # 13, 17
0 module is not available there), e.g. - solution only for *nix systems.

Lưu ý rằng một thư mục phải có tất cả các bộ 3 bit - đọc, viết và thực thi. OK, R không phải là một điều tuyệt đối, nhưng không thể liệt kê các mục trong thư mục (vì vậy bạn phải biết tên của họ). Mặt khác, thực thi là hoàn toàn cần thiết - w/o Nó Người dùng không thể đọc Inodes của tệp; Vì vậy, ngay cả có W, không có các tệp X cũng không thể được tạo hoặc sửa đổi. Giải thích chi tiết hơn tại liên kết này.
Ok, R is not an absolute must, but w/o it you cannot list the entries in the directory (so you have to know their names). Execute on the other hand is absolutely needed - w/o it the user cannot read the file's inodes; so even having W, without X files cannot be created or modified. More detailed explanation at this link.

Cuối cùng, các chế độ có sẵn trong mô -đun

    except (OSError, IOError) as e:
        if e.errno == errno.EACCES or e.errno == errno.EEXIST:  # 13, 17
2, các mô tả của chúng nằm trong Inode (7) người đàn ông.

Mã mẫu Cách kiểm tra:

import pwd
import stat
import os

def check_user_dir(user, directory):
    dir_stat = os.stat(directory)

    user_id, group_id = pwd.getpwnam(user).pw_uid, pwd.getpwnam(user).pw_gid
    directory_mode = dir_stat[stat.ST_MODE]

    # use directory_mode as mask 
    if user_id == dir_stat[stat.ST_UID] and stat.S_IRWXU & directory_mode == stat.S_IRWXU:     # owner and has RWX
        return True
    elif group_id == dir_stat[stat.ST_GID] and stat.S_IRWXG & directory_mode == stat.S_IRWXG:  # in group & it has RWX
        return True
    elif stat.S_IRWXO & directory_mode == stat.S_IRWXO:                                        # everyone has RWX
        return True

    # no permissions
    return False

Đã trả lời ngày 14 tháng 10 năm 2017 lúc 13:35Oct 14, 2017 at 13:35

Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục

Todor Minakovtodor MinakovTodor Minakov

18.1k3 Huy hiệu vàng52 Huy hiệu bạc58 Huy hiệu Đồng3 gold badges52 silver badges58 bronze badges

Kiểm tra xem một đối tượng chỉ số có thể đọc được hoặc có thể ghi không

hữu ích để kiểm tra xem một đường ống có thể đọc được hoặc có thể ghi không

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True
0

Dựa trên câu trả lời của Joe Koberg

Xem thêm: Điều tương tự trong JavaScript

có lẽ bị hỏng trên cửa sổ

Đã trả lời ngày 29 tháng 6 lúc 15:16Jun 29 at 15:16

Hướng dẫn python check permissions of a directory - python kiểm tra quyền của một thư mục

Milahumilahumilahu

1.8991 Huy hiệu vàng11 Huy hiệu bạc19 Huy hiệu đồng1 gold badge11 silver badges19 bronze badges