奇怪的os.chmod行为

时间:2012-07-04 04:12:15

标签: python shell scripting python-3.x

我有一个共享的git存储库创建脚本,我一直在Python 3.2.3中编写,虽然绝大多数脚本都在工作,而且几乎已经准备好生产(仍然有一些安全措施),我已经我遇到了一个尴尬的错误,对于我的生活,我无法弄明白。

在我的迭代更改模式部分:

try:
  if (args.debug):
    print('Recursively changing the access mode of target directory ' + full_path +
          ' to ' oct(stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH) + '.')
  if (args.debug):
    print('setting ' + full_path +
          ' to stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH ')
  os.chmod(full_path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH)
  for root, dirs, files in os.walk(full_path):
    for spam in dirs:
      if (args.debug):
        print('spam in dirs: ' + spam +
              '; stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH: ')
      os.chmod(os.path.join(root, spam), stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH)
    for eggs in files:
      if (args.debug):
        print('eggs in files: ' + eggs +
              '; stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH: ')
      os.chmod(os.path.join(root, eggs), stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH)
except OSError as e:
  if (args.debug):
    print('OSError raised during recursive chmod ' +
          oct(stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH) + ' setting. ' +
          'Removing the partially created repository.')
  shutil.rmtree(full_path)

我遇到了一个问题 - 它没有正确设置我的目录权限。事实上,它一直在完全相反;它已经剥离了我的所有目录权限。 运行脚本后,目录树类似于此:

d-----S--- 7 mat users 4096 Jul  3 23:10 test
ls: cannot open directory /home/mat/git/test: Permission denied

(setgid位在稍后的工作循环中设置) 显然,我遗漏了一些东西,但我无法确切地说出是什么,因为我正在使用stat模块的常量。并按位运算它们以获得我正在寻找的0o744值。

在任何人建议我使用八进制文字而不是stat模块的常量之前,我已尝试过,但结果相同。

任何帮助都会很棒。 ~M

1 个答案:

答案 0 :(得分:1)

(根据评论,发布此作为完整性的答案,因为这是问题。)

由于其余代码看起来没问题,似乎您的setgid循环可能正在清除您之前的权限。