Tentukan grup default dan izin untuk file baru di direktori tertentu

15

Saya memiliki direktori tertentu di mana ada proyek yang dibagikan oleh banyak pengguna. Para pengguna ini menggunakan SSH untuk mendapatkan akses ke direktori ini dan memodifikasi / membuat file.

Proyek ini seharusnya hanya dapat ditulisi ke grup pengguna tertentu: sebut saja "mygroup". Selama sesi SSH, semua file / direktori yang dibuat oleh pengguna saat ini harus secara default dimiliki oleh grup "mygroup" dan memiliki izin grup-dapat ditulis.

Saya dapat memecahkan masalah izin dengan umask:

$ cd project
$ umask 002
$ touch test.txt

File "test.txt" sekarang dapat ditulis grup, tetapi masih milik grup default saya ("mislav", sama dengan nama pengguna saya) dan bukan "mygroup". Saya dapat chgrpsecara rekursif untuk mengatur grup yang diinginkan, tetapi saya ingin tahu apakah ada cara untuk mengatur beberapa grup secara implisit seperti umask mengubah izin default selama sesi.

Direktori khusus ini adalah git repo bersama dengan copy yang berfungsi dan saya ingin git checkoutdan git resetoperasi untuk mengatur mask dan grup yang benar untuk file baru yang dibuat dalam copy pekerjaan. OSnya adalah Ubuntu Linux.

Pembaruan: seorang kolega menyarankan saya untuk melihat getfacl / setfacl dari POSIX ACL tetapi solusi di bawah ini yang dikombinasikan dengan umask 002sesi saat ini cukup baik untuk saya dan jauh lebih sederhana.

mislav
sumber

Jawaban:

19

Untuk memiliki semua file di bawah direktori tertentu yang mewarisi hak grup, Anda perlu menggunakan bit setgid pada direktori Anda. Lihat tautan ini .

 $ 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
ℝaphink
sumber
Terima kasih. Menarik bahwa saya tidak menemukan ini dengan googling
mislav
6

Jika Anda ingin melakukan ini dengan folder yang ada, Anda perlu memastikan bit setgid diaktifkan untuk semua subfolder juga. Namun, Anda tidak memerlukannya di file, dan Anda mungkin juga tidak menginginkannya di file. Berikut adalah cara mengaturnya untuk semua subfolder secara rekursif.

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

Saya tidak dapat menemukan sumbernya kembali, tetapi menggunakan setgiduntuk menyelesaikan masalah ini untuk repositori bare git, yang saya asumsikan adalah kasus Anda, sudah usang, dan dapat menyebabkan masalah dalam beberapa kasus.

Git dapat mengatasi semua ini melalui core.sharedRepositoryflag. Saya memiliki masalah yang sama dan menyelesaikannya sebagai berikut:

Dengan asumsi repogroupadalah grup Anda, dan Anda harus cdke direktori repo:

Pertama-tama ubah bendera yang dibagikan menjadi group:

git config core.sharedRepository group 

Catatan: di sini Anda harus menggunakan kata kunci group, bukan nama grup. Ini sama dengan membuat repositori kosong dengan opsi --shared=group.

Kemudian ubah grup untuk seluruh repositori:

chgrp -R repogroup .

Untuk memastikan bahwa direktori yang ada dapat ditulis-grup ( g+w), dan executable yang ada juga menjadi executable grup ( g+X) Anda juga perlu:

chmod -R g+wX .

Setelah Anda melakukan ini, git akan menghormati shared=groupbendera dan mengurus izin grup sebagai berikut, baik untuk file yang ada dan baru, sehingga Anda tidak perlu lagi umaskatau chgrp.

Saya akan memasukkan sumber dalam komentar jika saya menemukannya kembali.

gg
sumber
3

Saya tidak terlalu ahli dalam hal * nix, tapi saya pikir apa yang Anda cari disebut setgid.

Lihat di sini .

ThatGraemeGuy
sumber