Tại sao 666 quyền tạo tệp mặc định?


12

Như tôi đã tìm ra, khi sử dụng umask, quyền cao nhất bạn có thể cấp cho các tệp là 666. Điều này được thực hiện bởi umask 0000. Đó là vì các quyền tạo tệp mặc định, dường như là 666 trên mọi hệ thống mà tôi biết.

Tôi biết đối với các tệp chúng tôi cần quyền thực thi để hiển thị nội dung của chúng.
Nhưng tại sao chúng tôi giới hạn quyền tạo tệp mặc định trên 666?


Những loại hệ thống? Lần duy nhất umasktôi gặp luôn là 0022, tạo quyền mặc định 644.
manatwork

Không có bạn hiểu lầm. Umask đang sử dụng quyền truy cập tệp mặc định của 666 và tạo giá trị riêng cho nó (là 0022 cho hệ thống của bạn). Vì vậy, hầu hết các quyền bạn có thể đặt là umask 0000- vẫn giới hạn quyền truy cập tệp 666. (Nhưng rõ ràng các thư mục sử dụng 777)
Peter

Bắt được rồi. Bây giờ đây là một câu hỏi hay.
manatwork

2
Bạn không cần quyền thực thi để xem nội dung tệp. Điều này là như vậy đối với các thư mục đó là lý do tại sao các thư mục được tạo theo mặc định với quyền thực thi.
Joseph R.

1
Tôi tin rằng [nhưng sẽ cần phải xem xét thêm để chắc chắn] rằng đây là do thiết kế, để tránh một số vấn đề bảo mật: không có quyền truy cập vào "chmod", bạn không thể tạo tệp thực thi. umask 0000 tạo các tệp có 0666 và các thư mục có 0777 [nhân tiện, đây là một cài đặt mặc định khá tệ, bảo mật khôn ngoan!]
Olivier Dulac

Câu trả lời:


10

Theo như tôi có thể nói, điều này được mã hóa cứng thành các tiện ích tiêu chuẩn. Tôi stracevừa touchtạo một tệp mới vừa mkdirtạo thư mục mới.

Dấu touchvết tạo ra điều này:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

trong khi mkdirdấu vết tạo ra điều này:

mkdir("newdir", 0777)                   = 0

Thiếu mã hóa quá trình tạo tệp / thư mục trong C, tôi không thấy cách sửa đổi các quyền mặc định. Tuy nhiên, dường như đối với tôi, việc không làm cho các tệp thực thi theo mặc định có ý nghĩa: bạn không muốn bất kỳ văn bản ngẫu nhiên nào vô tình bị hiểu nhầm là các lệnh shell.

Cập nhật

Để cho bạn một ví dụ về cách các bit quyền được mã hóa cứng vào các tiện ích tiêu chuẩn. Dưới đây là một số dòng có liên quan từ hai tệp trong coreutilsgói chứa mã nguồn cho cả hai touch(1)mkdir(1), trong số các tệp khác:

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

Nói cách khác, nếu chế độ không được chỉ định, hãy đặt nó thành S_IRWXUGO(đọc: 0777) được sửa đổi bởi umask_value.

touch.c thậm chí còn rõ ràng hơn:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

Tất nhiên, đó là cấp quyền đọc và ghi cho mọi người (đọc: 0666), điều này sẽ được sửa đổi theo quy trình umasktạo tệp, tất nhiên.

Bạn có thể làm được việc này lập trình chỉ: tức là trong khi tạo ra các file từ bên trong hoặc là một chương trình C, nơi bạn thực hiện các cuộc gọi hệ thống trực tiếp hoặc từ bên trong một ngôn ngữ cho phép bạn thực hiện một syscall ở mức độ thấp (xem ví dụ của Perl sysopendưới perldoc -f sysopen).


Bạn nói đúng, tôi không muốn bất kỳ tai nạn. Nhưng không có cách nào để thay đổi nó, thật kinh khủng! Giá trị tiêu chuẩn phải là 777. Và chúng tôi cần umask fileumask dir. Đặt hai giá trị mặc định khác nhau và tốt. Nhưng bây giờ tôi không có cách nào để tạo tập tin với perm perm.
Peter

1
@PeterI Vâng, mkdir(1)cung cấp cho bạn một -mcông tắc để chỉ định chế độ của thư mục tại thời điểm tạo. Tuy nhiên, với các tệp, do việc tạo tệp sử dụng tòa nhà open(2), công cụ bạn sử dụng để tạo tệp là công cụ chịu trách nhiệm truyền các bit chế độ đến openvà bạn không nói gì trong vấn đề này. install(1)theo mặc định, sao chép tệp của bạn sang một vị trí mới và đặt các bit thực thi, nhưng điều đó vẫn không xảy ra tại thời điểm tạo.
Joseph R.

Những gì bạn đang nói, touchví dụ đó có trách nhiệm thiết lập các giá trị đúng. Bạn có biết nơi nó lưu trữ các giá trị? Có lẽ chúng được đặt trên toàn hệ thống - vì vậy chúng tôi có thể thay đổi chúng? Bởi vì tôi muốn giải thoát ;)
Peter

@PeterI Xem câu trả lời cập nhật.
Joseph R.

1
@PeterI Tôi cập nhật lại câu trả lời. Bạn có thể tạo tòa nhà trực tiếp từ bên trong C hoặc ngôn ngữ khác như Perl.
Joseph R.

6

Trước hết, không có mặc định toàn cầu, các quyền phụ thuộc vào ứng dụng tạo tệp. Ví dụ: chương trình C nhỏ này sẽ tạo một tệp '/ tmp / foo' với quyền 0777 nếu umask là 0000 (trong mọi trường hợp, quyền sẽ là 0777 & ~ umask):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

Điều đó đang được nói, nhiều ứng dụng tạo các tệp có quyền 0666. Điều đó có hai lý do:

  1. Bảo mật: bạn không muốn bất kỳ tệp tùy ý nào có thể được thực thi.
  2. Thuận tiện: hầu hết các tập tin không cần phải được thực thi. Dễ dàng thiết lập bit thực thi trên một vài tệp được chọn hơn là bỏ đặt nó trên số lượng lớn các tệp khác. Tất nhiên, umask 0133 sẽ giải quyết vấn đề này, nhưng sau đó không có gì giành được và bạn không thể để các chương trình tạo các tệp thực thi ngay cả khi bạn muốn.

1
Các tệp được tạo mà không có bit x (thực thi) được đặt vì lý do bảo mật. Việc thực thi các tập tin vô tình [cw] phải là một "Điều xấu" (tm). Chương trình chmod cung cấp cho bạn khả năng (tái) thiết lập các bit quyền khi cần thiết.
ChuckCottrill
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.