在我正在研究的Linux服务器上,我需要创建具有以下结构的目录:
/dir1/dir2/dir3/YYYY/MM/DD/file.ext
某些情况(因为目录取决于日期)我需要一次创建多个目录,例如... / 2011/01/01 /,所有这些都需要权限0o2755
当我在服务器上使用os.makedirs(dir,mode = 0o2755)时,它正确设置了权限的0o755部分,但忽略了SGID(2)位。我猜这是因为os.makedirs忽略了某些系统的权限,正如文档所描述的那样。我已经读过其他人遇到过umask和os.makedirs()的问题,但是我玩过umask(设置为0002,我尝试了0000)并且它仍然忽略了SGID位。
我的解决方案是以下功能:
def special_makedirs(base_dir, target_dir, mode=0o2755):
base_dir = os.path.abspath(base_dir)
target_dir = os.path.abspath(target_dir)
if os.path.commonprefix([base_dir, target_dir]) != base_dir:
log.error("Target directory %s is not a subdirectory of %s" %(target_dir, base_dir))
raise ValueError("Target directory %s is not a subdirectory of %s" % (target_dir, base_dir))
# Create initial directory
os.makedirs(target_dir, mode=mode)
# Verify permissions
temp = target_dir
while temp != base_dir and stat.S_IMODE(os.stat(temp)) != mode:
os.chmod(temp, mode)
temp = os.path.split(temp)[0]
现在我确定这不符合所有情况,但我将是唯一一个使用此功能以满足我的特定需求。
所以...我的问题是:
我是否误解了os.makedirs文档,因为它说它忽略了某些系统的权限?有其他人有这个问题吗?
我的功能似乎是解决此问题的最有效方法吗?
感谢您提供的任何提示。对不起,如果我的情况没有意义。
答案 0 :(得分:0)
来自mkdir(2)
手册页:
NOTES Under Linux apart from the permission bits, only the S_ISVTX mode bit is honored. That is, under Linux the created directory actually gets mode (mode & ~umask & 01777).
所以是的,SGID被忽略了。事后设定它。