Làm cách nào để cấp đọc / ghi cho người dùng cụ thể trong bất kỳ thư mục con tồn tại hoặc tương lai của một thư mục nhất định?


8

Tôi lưu trữ kho git của riêng tôi trên VPS. Giả sử người dùng của tôi là john.

Tôi đang sử dụng giao thức ssh để truy cập kho git của mình, vì vậy url của tôi là như thế ssh://john@myserver.com/path/to/git/myrepo/.

Root là chủ sở hữu của mọi thứ bên dưới /path/to/git

Tôi đang cố gắng cấp quyền truy cập đọc / ghi cho john cho mọi thứ bên dưới /path/to/git/myrepo

Tôi đã thử cả hai chmodsetfaclđể kiểm soát truy cập, nhưng cả hai đều thất bại theo cùng một cách: họ áp dụng các quyền đệ quy (với các tùy chọn phù hợp) cho tất cả các thư mục con hiện tại của /path/to/git/myrepo, nhưng ngay khi một thư mục mới được tạo, người dùng của tôi không thể viết trong thư mục mới.

Tôi biết rằng có những móc nối trong git sẽ cho phép tôi áp dụng lại các quyền sau mỗi lần cam kết, nhưng tôi bắt đầu nghĩ rằng mình đang đi sai hướng vì điều này có vẻ quá phức tạp cho mục đích rất cơ bản.

H : Làm thế nào tôi nên thiết lập quyền của mình để cấp cho rw quyền truy cập vào john cho bất cứ điều gì bên dưới /path/to/git/myrepovà làm cho nó trở nên linh hoạt để thay đổi cấu trúc cây?

Q2 : Nếu tôi nên lùi một bước thay đổi cách tiếp cận chung, xin vui lòng cho tôi biết.

Chỉnh sửa : Câu hỏi đã được trả lời như vậy, nhưng đó là câu hỏi sai. Câu hỏi đúng sẽ là "Làm cách nào để định cấu hình kho lưu trữ git trần trên máy chủ để sử dụng với quyền truy cập ssh?". Xem câu trả lời của riêng tôi.

Câu trả lời:


5

tạo một nhóm myrepouserschẳng hạn và thêm người dùng git của bạn vào nhóm đó.

Sau đó thay đổi nhóm mọi thứ bên dưới / path / thành / git / myrepo thành myreplahoma:

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

Sau đó sửa các quyền:

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

Nên được thiết lập tất cả.


2
Nếu bạn muốn hiểu những gì đang diễn ra ở đây Samuel, Google cho "setgid". Điều kỳ diệu ở đây là trong g+s. Tất nhiên trước tiên bạn sẽ phải hiểu những điều cơ bản chmod.
iconoclast

Tôi nghĩ rằng tôi đã hiểu làm thế nào để làm điều đó với + s trên thư mục nhưng nó không làm được điều tôi mong đợi: quyền không được truyền đến các thư mục mới. Mã thông báo cuối cùng và thứ 3 cuối cùng có nghĩa là gì: {} và \ Cảm ơn trước.
Samuel Rossille

{}- là một giữ chỗ để thay thế tên tập tin. ;là dấu chấm hết của lệnh được thực thi bởi -exec. Như ;có ý nghĩa đặc biệt trong bashnó phải được thoát với \. xem man findđể biết chi tiết
Serge

4

Thật ra đó là cách tiếp cận sai. Sau khi nghiên cứu bổ sung, tôi phát hiện ra rằng trong trường hợp của mình, tôi phải sử dụng các tính năng xây dựng của git để xử lý quyền của hệ thống tệp trong kho lưu trữ.

Về cơ bản, nó được thực hiện với sharedtùy chọn git init, có thể có (trong số khác) các giá trị sau:

  • group: khởi tạo kho lưu trữ để các tệp và thư mục có quyền truy cập ghi người dùng và nhóm và mọi người khác có quyền truy cập đọc
  • 0660: giống nhau nhưng không có quyền truy cập đọc cho người khác.

Các thư mục và tập tin mới được tạo tự động có quyền. Bạn cũng có thể sử dụng git inittrên một kho lưu trữ hiện có để cấu hình lại nó mà không mất nội dung của nó.

Vì vậy, cuối cùng tôi phải làm gì:

  • Tạo một nhóm mygitrepo
  • Thêm người dùng vào nó
  • chmod -R kho git để root:mygitrepo

Và bây giờ mọi người dùng của nhóm đều có thể kéo / đẩy, và không ai khác có thể, và điều đó mà không gây rối với các quyền hệ thống tệp.

git init --bare --shared=0660

http://www.kernel.org/pub/software/scm/git/docs/git-init.html để biết thêm thông tin.


2

Nếu ACL được hỗ trợ, bạn có thể làm điều đó với ACL mặc định. Coi chừng bạn dễ quên những thứ đó vì chúng không xuất hiện khi bạn làm ls -l.

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

Nhưng, tôi nghi ngờ bạn có thể muốn làm một cái gì đó có tổ chức hơn một chút. Triển khai gitolite có thể cung cấp một giải pháp tốt hơn.


1
Ít nhất là với Debian Wheezy's ls(và tôi nghĩ Squeeze cũng vậy), bạn nhận được một +phần cuối của các quyền để nói rằng có một ACL:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert

Cảm ơn công việc này, nhưng bạn có thể vui lòng làm rõ ý nghĩa của hai mã thông báo cuối cùng: {} +
Samuel Rossille

Đó là find ... -exec cmd {} +cú pháp, nơi {}được thay thế bằng càng nhiều tên tệp tìm thấy càng tốt (như được thay thế {} \;ở nơi {}chỉ được thay thế bằng một tệp tìm thấy tại một thời điểm)
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.