Bagaimana cara memberikan baca / tulis kepada pengguna tertentu di subdirektori yang ada atau di masa mendatang dari direktori yang diberikan?

8

Saya meng-host repositori git saya sendiri di VPS. Katakanlah pengguna saya adalah john.

Saya menggunakan protokol ssh untuk mengakses repositori git saya, jadi url saya mirip ssh://[email protected]/path/to/git/myrepo/.

Root adalah pemilik semua yang ada di bawah /path/to/git

Saya mencoba memberikan akses baca / tulis ke john untuk semua yang ada di bawah /path/to/git/myrepo

Saya sudah mencoba baik chmoddan setfaclakses kontrol, namun keduanya gagal dengan cara yang sama: mereka menerapkan hak rekursif (dengan pilihan yang tepat) untuk semua subdirektori yang ada saat ini dari /path/to/git/myrepo, tetapi segera setelah direktori baru dibuat, pengguna saya tidak bisa menulis di direktori baru.

Saya tahu bahwa ada kaitan di git yang akan memungkinkan saya untuk menerapkan kembali hak setelah setiap komit, tetapi saya mulai berpikir bahwa saya salah jalan karena ini tampaknya terlalu rumit untuk tujuan yang sangat mendasar.

T : Bagaimana saya harus mengatur hak saya untuk memberikan akses baru ke john ke apa pun di bawah /path/to/git/myrepodan membuatnya tangguh terhadap perubahan struktur pohon?

T2 : Jika saya harus mengambil langkah mundur mengubah pendekatan umum, tolong katakan padaku.

Sunting : Pertanyaan dijawab apa adanya, tapi itu adalah pertanyaan yang salah. Pertanyaan yang tepat adalah "Bagaimana mengkonfigurasi repositori bare git di server untuk digunakan dengan akses ssh?". Lihat jawaban saya sendiri.

Samuel Rossille
sumber

Jawaban:

5

buat grup myrepousersmisalnya, dan tambahkan pengguna git Anda ke grup itu.

Kemudian ubah grup dari semua yang ada di bawah / path / ke / git / myrepo ke myrepousers:

chown -R .myrepousers /path/to/git/myrepo

Kemudian perbaiki izin:

chmod -R g+w /path/to/git/myrepo
find /path/to/git/myrepo -type d -exec chmod -R {} g+s \;

Harus siap.

Serge
sumber
2
Jika Anda ingin memahami apa yang terjadi di sini, Samuel, Google untuk "setgid". Keajaiban di sini adalah di g+s. Tentu saja Anda harus terlebih dahulu memahami dasar-dasarnya chmodjuga.
iconoclast
Saya Pikir saya sudah mengerti bagaimana melakukannya dengan + s pada direktori tetapi itu tidak melakukan apa yang saya harapkan: izin tidak dikirimkan ke direktori baru. Apa arti token terakhir terakhir dan ketiga: {} dan \ Terima kasih sebelumnya.
Samuel Rossille
{}- adalah pengganti untuk nama file pengganti. ;adalah terminator dari perintah yang dieksekusi oleh -exec. Seperti ;memiliki makna khusus di bashdalamnya, harus diloloskan dengan \. lihat man finddetailnya
Serge
4

Sebenarnya itu pendekatan yang salah. Setelah penelitian tambahan, saya menemukan bahwa dalam kasus saya, saya harus menggunakan fitur buildin pengguna git untuk menangani hak filesystem dalam repositori.

Ini pada dasarnya dilakukan dengan sharedopsi git init, yang dapat memiliki (antara lain) nilai-nilai berikut:

  • group: inisialisasi repositori sehingga file dan direktori memiliki akses tulis pengguna dan grup, dan semua orang memiliki akses baca
  • 0660: sama tetapi tanpa akses baca untuk yang lain.

Direktori dan file yang baru dibuat secara otomatis memiliki izin yang tepat. Anda juga dapat menggunakan git initrepositori yang sudah ada untuk mengkonfigurasi ulang tanpa kehilangan kontennya.

Jadi pada akhirnya apa yang harus saya lakukan:

  • Buat grup mygitrepo
  • Tambahkan pengguna ke dalamnya
  • chmod -R repositori git menjadi root:mygitrepo

Dan sekarang setiap pengguna grup dapat menarik / mendorong, dan tidak ada orang lain yang bisa, dan itu tanpa mengacaukan hak sistem file.

git init --bare --shared=0660

http://www.kernel.org/pub/software/scm/git/docs/git-init.html untuk informasi lebih lanjut.

Samuel Rossille
sumber
2

Jika ACL didukung, Anda dapat melakukannya dengan ACL default. Berhati-hatilah karena mudah melupakannya karena tidak muncul saat Anda melakukan ls -l.

find /path/to/git/myrepo -type d -exec setfacl -m d:u:john:rwx {} +

Tapi, saya curiga Anda mungkin ingin melakukan sesuatu yang sedikit lebih terorganisir. Menyebarkan gitolite dapat memberikan solusi yang lebih baik.

Stéphane Chazelas
sumber
1
Setidaknya dengan Debian Wheezy's ls(dan saya pikir Squeeze juga) Anda mendapatkan +di akhir izin untuk mengatakan ada ACL:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert
Terima kasih ini berhasil, tetapi bisakah Anda menjelaskan arti dari dua token terakhir: {} +
Samuel Rossille
Itu find ... -exec cmd {} +sintaks, di mana {}diganti dengan banyak nama file yang ditemukan sebanyak mungkin (seperti oppsed ke {} \;mana {}hanya diganti dengan satu file yang ditemukan pada satu waktu)
Stéphane Chazelas