Tạo tập tin và thư mục với một chủ sở hữu (người dùng / nhóm) nhất định trong khi sudoing


22

Tôi cần wgetmột cái gì đó (kết quả là một tệp nén trong cwd), sau đó tôi phải giải nén nó, sau đó thực hiện một số công cụ sao chép / di chuyển / sửa đổi và cuối cùng có thể thực thi một tập lệnh (từ kho lưu trữ đã tải xuống).

Bây giờ tất cả các tác vụ này trực tiếp ( wget, giải nén, v.v.) hoặc gián tiếp (chạy tập lệnh) dẫn đến việc tạo các tệp và thư mục (tất cả trong thư mục làm việc hiện tại). Tôi làm tất cả những thứ này như root(không có cách nào để làm điều đó với người dùng mong muốn cuối cùng).

Vấn đề là: Mọi thứ được tạo trong tiến trình đều thuộc sở hữu của người dùng root hoặc sudo. Khi tôi hoàn thành (và đôi khi ở giữa chừng), tôi phải đưa ra một loạt các lệnh chmodchownlệnh để làm cho mọi thứ trở nên đúng đắn.

Bây giờ sẽ thật tuyệt nếu bằng cách nào đó có thể nói với hệ thống rằng "Từ giờ trở đi, bất kỳ tệp hoặc thư mục nào bạn tạo khi tôi phát lệnh dưới dạng root, bạn sẽ tạo với quyền sở hữu và quyền như vậy".

Câu trả lời:


26

Bạn luôn có thể sudo -u username touch filenamekhi tập lệnh của bạn được thực thi như root. Nó thường không yêu cầu mật khẩu, tùy thuộc vào sudoerscấu hình của bạn .

Cách khác, chạy su username -c touch filename. Các đối số bổ sung được cung cấp cho trình bao của người dùng và -ctùy chọn cho trình bao thực thi các lệnh được chỉ định theo quy ước.


Một số lệnh (như mkdir) hỗ trợ các đối số để chỉ định các quyền:

mkdir -m 0700 foo

Theo mặc định, các thao tác tệp tôn trọng umasktập hợp cho trình bao. Nó xác định những quyền nào bị từ chối . Một umasksố 0022ví dụ thực hiện không thiết lập quyền ghi cho nhóm và những người khác. Đặt để 0077ngăn nhóm và những người khác nhận được bất kỳ quyền.


Bạn có thể đặt các setgidthư mục trên để có tất cả các tệp được tạo trong kế thừa thành viên nhóm của chúng:

chmod g+s someDir

Một số Unix hỗ trợ hành vi tương tự cho setuid( chmod u+s), nhưng không phải Linux.


1
Tôi nghĩ thật an toàn khi cho rằng không có hỗ trợ chuyên dụng cho những gì bạn yêu cầu. Chỉ siêu người dùng mới có thể gửi chowntệp cho một người dùng khác và đặt mặc định như thế này có khả năng xảy ra lỗi người dùng, cung cấp cho người dùng quyền khác mà không cần rootngười dùng nhận ra.
Daniel Beck

10

Có một cách khác, tôi nghĩ khá tao nhã. Sử dụng cài đặt (1)

Ví dụ, zabbix-agentd cần một thư mục con bên trong / var / run, nhưng các bản phân phối gần đây đang sử dụng tmpfs cho / var / run, vì vậy thư mục không tồn tại khi khởi động lại. Tôi đã giải quyết nó bằng cách tạo một tập tin / etc / sysconfig / zabbix-agentd có chứa:

install -g zabbix -o zabbix -d /var/run/zabbix

1
Thêm cũng -m 0700chẳng hạn. Câu trả lời.
Đổ chuông

3
Lưu ý rằng installtạo thư mục và sau đó thay đổi chủ sở hữu / nhóm. Vì vậy, có một thời gian ngắn mà thư mục không có chủ sở hữu / nhóm được chỉ định. Trong một số bối cảnh nó có thể quan trọng.
dùng368507

Điều này hoạt động trên Alpine Linux
Mauricio Sánchez

3

Trên các hệ thống giống như Unix, các tệp và thư mục mới được tạo thuộc sở hữu của chủ sở hữu của quá trình tạo ra chúng. Các tiện ích tiêu chuẩn thường không có tùy chọn để thay đổi chủ sở hữu của các tệp đã tạo.

Các biến có UID và GID của người dùng ban đầu

Nếu bạn chạy một số lệnh liên tục, bạn có thể sử dụng các biến $SUDO_UID$SUDO_GIDđể chỉ người dùng đã gọi sudo:

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

Tự động lấy danh sách các tệp và thư mục đã tạo

Nếu bạn muốn tự động nhận danh sách các tệp và thư mục đã tạo (và có thể sửa đổi), bạn có thể chạy các lệnh của mình dưới sự stracegiám sát dựa trên tòa nhà ptrace():

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

hoặc bạn có thể sử dụng ví dụ như Installwatch dựa trên LD_PRELOADcơ chế.

Ý tưởng cho công việc tiếp theo

Dựa trên các phương pháp được đề cập ở trên, có thể tạo một công cụ tự động thay đổi chủ sở hữu và có thể quyền truy cập của các tệp được tạo / sửa đổi. Việc sử dụng có thể đơn giản như:

sudo watch-chown do_something
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.