1

私はPython3.2.3で書いている共有gitリポジトリ作成スクリプトを持っています。スクリプトの大部分が機能していて、ほぼ本番環境に対応している間(まだある程度のセキュリティが確保されています)、厄介なバグで、私の人生では理解できません。

私の反復変更モードセクション中:

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モジュールの定数の代わりに8進リテラルを使用することを誰かが提案する前に、私はそれを試しましたが、同じ結果になりました。

どんな助けも壮大だろう。〜M

4

1 に答える 1

1

(コメントによると、これが問題だったので、完全を期すためにこれを回答として投稿してください。)

コードの残りの部分は問題ないように見えるため、setgidループによって以前のアクセス許可がクリアされている可能性があります。

于 2012-07-04T16:28:14.060 に答える