确定目录是否可写
Python中最好的方法是确定目录是否对执行脚本的用户是可写的? 由于这可能涉及使用os模块,我应该提到我在* nix环境下运行它。
尽pipeChristophe所build议的是一个更为Pythonic的解决scheme,但os模块确实具有os.access函数来检查访问:
os.access('/path/to/folder', os.W_OK)
用于写入,R_OK用于读取等。
这似乎很奇怪,但一个常见的Python成语是
请求宽恕比允许要容易
遵循这个习惯用法,人们可能会说:
尝试写入有问题的目录,并在没有权限的情况下捕获错误。
我的解决scheme使用tempfile
模块:
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
如果你只关心文件权限, os.access(path, os.W_OK)
应该做你所要求的。 如果您想知道是否可以写入目录,请open()
一个用于写入的testing文件(它不应该事先存在),捕获并检查任何IOError
,然后清理testing文件。
更一般的说,为了避免TOCTOU攻击(如果你的脚本是用suid或者cgi等特权提升的话,只有一个问题),你不应该真的相信这些提前testing,但是不要放弃priv, ,并期待IOError
。
在这个主题中寻找某人的例子。 在Google上的第一个结果,恭喜!
人们在这个线程中谈论Pythonic的做法,但没有简单的代码示例? 在这里,你去了,谁是谁的绊脚石:
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")
这将尝试打开一个文件句柄进行写入,如果指定的文件不能写入,则会退出并显示一个错误:这样读起来就容易多了,而且是一个更好的方法,而不是对文件path或目录进行预先检查,因为它避免了竞争条件; 在运行预选检查时间以及实际尝试写入文件时,文件变得不可写入的情况。
检查模式位:
def isWritable(name): 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) )
这是我根据ChristopheD的回答创build的:
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"
if os.access(path_to_folder, os.W_OK) is not True: print("Folder not writable") else : print("Folder writable")
有关访问的更多信息可以在这里find它
如果你需要检查另一个用户的权限(是的,我意识到这个矛盾的问题,但可能会派上用场),你可以通过pwd
模块,目录的模式位。
免责声明 – 在Windows上不起作用,因为它不使用POSIX权限模型(并且pwd
模块在那里不可用),例如 – 仅用于* nix系统的解决scheme。
请注意,一个目录必须设置所有3位 – 读,写和执行。
好吧,R不是绝对必须的,但是无法列出目录中的条目(所以你必须知道它们的名字)。 另一方面执行是绝对需要的 – 没有用户不能读取文件的inode; 所以即使有W,没有X文件也不能被创build或修改。 在这个链接更详细的解释。
最后,这些模式在stat
模块中可用,它们的描述在inode(7)man中 。
示例代码如何检查:
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