web-dev-qa-db-ja.com

特定のディレクトリにある新しいファイルのデフォルトグループと権限を指定する

複数のユーザーが共有するプロジェクトがある特定のディレクトリがあります。これらのユーザーは、SSHを使用してこのディレクトリにアクセスし、ファイルを変更または作成します。

このプロジェクトは、特定のユーザーグループにのみ書き込み可能である必要があります。「mygroup」と呼んでください。 SSHセッション中、現在のユーザーが作成したすべてのファイル/ディレクトリは、デフォルトでグループ "mygroup"が所有し、グループに書き込み可能な権限を持っている必要があります。

umaskで権限の問題を解決できます:

$ cd project
$ umask 002
$ touch test.txt

ファイル「test.txt」はグループ書き込み可能になりましたが、まだ私のデフォルトグループ(「ユーザー名」と同じ「mislav」)に属しており、「mygroup」には属していません。 chgrpを再帰的に使用して目的のグループを設定できますが、セッション中にumaskがデフォルトのアクセス許可を変更するなど、いくつかのグループを暗黙的に設定する方法があることを知りたいと思いました。

この特定のディレクトリは、作業コピーを含む共有gitリポジトリであり、git checkoutおよびgit reset操作により、作業コピーで作成された新しいファイルに正しいマスクとグループを設定します。 OSはUbuntu Linuxです。

更新:POSIX ACL のgetfacl/setfaclを調べる必要があると同僚が示唆していますが、以下の解決策はumask 002現在のセッションでは、私には十分で、はるかに単純です。

15
mislav

特定のディレクトリ下のすべてのファイルにグループ権限を継承させるには、ディレクトリでsetgidビットを使用する必要があります。 このリンク を参照してください。

 $ mkdir test
 $ Sudo chown raphink.staff test
 $ ls -lhd test
     drwxr-xr-x 2 raphink staff 4.0K 2009-12-21 16:19 test
 $ Sudo chmod g+s test # Set the setgid bit
 $ ls -lhd test
     drwxr-sr-x 2 raphink staff 4.0K 2009-12-21 16:21 test
 $ touch test/foo
 $ ls -lh test
     total 0
     -rw-r--r-- 1 raphink staff 0 2009-12-21 16:23 foo
19
ℝaphink

既存のフォルダでこれを行う場合は、すべてのサブフォルダでもsetgidビットが有効になっていることを確認する必要があります。ただし、ファイルでは必要ありません。また、ファイルでも必要ありません。すべてのサブフォルダに再帰的に設定する方法は次のとおりです。

find /path/to/base/dir -type d -exec chmod g+s {} +
6
andrewtweber

私はソースを見つけることができませんが、setgidを使用してベアgitリポジトリのこの問題を解決することは、私があなたのケースだと思いますが、非推奨であり、場合によっては問題を引き起こす可能性があります。

Gitはcore.sharedRepositoryフラグを介してこれらすべてを処理できます。私は同じ問題を抱えており、それを次のように解決しました:

repogroupがグループで、repoディレクトリにcdがあると仮定します。

最初に共有フラグをgroupに変更します。

git config core.sharedRepository group 

注:ここでは、グループ名ではなく、キーワードgroupを使用する必要があります。これは、オプション--shared=groupを使用してベアリポジトリを作成するのと同じです。

次に、リポジトリ全体のグループを変更します。

chgrp -R repogroup .

既存のディレクトリがグループ書き込み可能(g+w)であり、既存の実行可能ファイルもグループ実行可能(g+X)になることを確認するには、次の操作も必要です。

chmod -R g+wX .

これを実行すると、gitはshared=groupフラグを尊重し、既存のファイルと新しいファイルの両方について、以下のグループ権限を処理します。そのため、umaskまたはchgrpに再度アクセスする必要はありません。

見つかった場合は、コメントにソースを追加します。

4
ggll

* nixに関しては、私はあまり専門家ではありませんが、探しているものはsetgidと呼ばれていると思います。

こちら を参照してください。

3
ThatGraemeGuy

ACLを使用せずにLinux/UNIXで親ディレクトリの権限を継承することは困難です。しかし、デフォルトのファイル権限を割り当てる方法があります。以下のリンクを確認してください

親ディレクトリの権限を継承できます。

1
kvmreddy