Tại sao 777 được gán cho chmod để cho phép mọi thứ trên một tệp?


54

Tôi đã được hỏi trong một cuộc phỏng vấn tại sao 777 được chỉ định để có tất cả các quyền cho một tập tin. Tại sao không phải là 555? Ông nói rằng có lý do cho tất cả mọi thứ. Vậy, lý do của 777 là gì? Tại sao không phải bất kỳ số nào khác? Có bất kỳ ý nghĩa trong số này?



2
Tham khảo bình luận liên kết của @ AvinashRaj và áp dụng nó vào ví dụ. Câu hỏi "Tại sao?" phụ thuộc vào trường hợp nào và mục đích của nó là gì ... :)
AzkerM

1
Có phải anh ấy hỏi về tầm quan trọng của số 7 so với 5 hoặc tại sao chúng là số thay vì chữ cái?
Braiam

4
Đây là một câu hỏi phỏng vấn tuyệt vời; Tôi có thể phải đánh cắp nó.
Kỹ thuật số Chris

5
Nói đúng ra, đó không phải là 777, mà là 0777.
Ruslan

Câu trả lời:


129

Tôi sẽ cố gắng giải quyết lý do cơ bản tại sao nó là 777, thay vì aaa, hoặc 999.

Hãy nhớ rằng các quyền có định dạng sau:

 u   g   o
rwx rwx rwx

trong đó u = người dùng, g = nhóm, o = khác.

Bây giờ, hãy tưởng tượng bạn đang đại diện cho mỗi nhóm này dưới dạng nhị phân. 1 là đúng, 0 là sai.

Nếu bạn muốn cấp quyền truy cập đầy đủ cho mọi người, bạn sẽ chỉ định các quyền sau dưới dạng nhị phân:

 u   g   o
rwx rwx rwx
111 111 111

Bây giờ, nếu bạn biết nhị phân, bạn sẽ nhận ra rằng khi bạn chuyển đổi 111từ nhị phân sang thập phân, bạn sẽ nhận được 7.

Vì vậy, bạn có thể đại diện cho toàn quyền truy cập như 777.

Lưu ý: Chúng tôi thực sự chuyển đổi từ nhị phân sang bát phân. Xem chỉnh sửa dưới đây.

Điều này hoạt động cho tất cả các chế độ truy cập khác là tốt.

Chẳng hạn, chúng ta có thể dễ dàng tìm ra ý 555nghĩa của việc chuyển đổi từng loại 5thành nhị phân và viết nó theo định dạng trên. 5trong nhị phân là 101, vì vậy chúng tôi có các quyền sau:

 u   g   o
r-x r-x r-x
101 101 101
 5   5   5

Tương tự, nếu chúng tôi muốn cung cấp tất cả các quyền cho người dùng, nhưng chỉ cho phép người khác đọc, chúng tôi có thể tìm thấy một đại diện số.

 u   g   o
rwx r-- r--
111 100 100
 7   4   4

Bây giờ, chúng ta biết rằng 111trong nhị phân là 7số thập phân và 100nhị phân là 4số thập phân. Như vậy, các quyền sẽ được 744.

Biên tập:

Về mặt kỹ thuật, như được nhấn mạnh bởi @ LưuViênPhúc và @Braiam, chúng tôi đang chuyển đổi từ nhị phân sang bát phân, như được mô tả dưới đây. Tuy nhiên, biểu diễn thập phân và bát phân của các số <8 là như nhau, vì vậy đối với các số nhị phân có 3 chữ số trở xuống, cả hai biểu diễn thập phân và bát phân đều giống nhau.

Khi được biểu diễn dưới dạng số bát phân, thay vì chia thành các nhóm ba và thực hiện chuyển đổi nhị phân sang thập phân trên mỗi nhóm, bạn thực sự có thể lấy cả ba nhóm làm một số nhị phân duy nhất và chuyển đổi thành bát phân.

Ví dụ: đây là một số chuyển đổi nhị phân sang bát phân:

0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744

Lưu ý rằng tôi đang chuẩn bị "0b" và "0o" để phân biệt giữa số nhị phân và số bát phân.

Nếu bạn muốn chơi xung quanh với điều này, hãy mở một thiết bị đầu cuối, chạy pythonvà sau đó chơi xung quanh với các lệnh sau:

oct(0b111111111)
bin(0o555)

Hãy nhớ thêm "0b" hoặc "0o" vào các số để cho máy tính biết cơ sở nào bạn quan tâm. (Nếu bạn không, nó sẽ giả sử cơ sở 10.)


17
Chỉ vì mục đích hoàn chỉnh, định dạng của các số được gọi là octals có nghĩa đen là cơ sở của 8 (vì chúng bắt đầu từ 0 là 7 + 1 = 8).
Braiam

3
davie: bát phân là dễ dàng vì nó thực sự nhóm ba bit, giống như nhóm bốn thập lục phân. Số thập phân không phải là lũy thừa của 2, vì vậy nó không nhóm các bit một cách độc đáo.
Konerak

2
Vâng, bạn nhận được cùng một số trong cả hai trường hợp. Tôi nghĩ nhiều khả năng ai đó sẽ hiểu chuyển đổi nhị phân sang thập phân hơn là chuyển đổi nhị phân sang bát phân. Ngoài ra, tôi đã thêm một phần ở cuối để làm rõ rằng các số thực sự là số bát phân, không phải là số thập phân.
daviewales

3
7là giống nhau trong số thập phân và bát phân - tuy nhiên, 777là không. Khi bạn nói về việc lật bit, nó sẽ tạo ra sự khác biệt.
Sam Dufel

2
Chỉ vì lợi ích tầm thường 7 được gọi là Số của Chúa và người dùng root, quyền của người mặc định 777đôi khi được gọi là Thần.
Eyoung100

16

Đọc quyền cho phép tập tin 4, viết phương tiện cho phép tập tin 2và thực thi phương tiện cho phép tập tin 1.

Vì vậy, tổng số này là 7.

Bây giờ 777 là gì: đầu tiên 7là dành cho chủ sở hữu tệp có nghĩa là chủ sở hữu tệp đã đọc, quyền và thực thi quyền.

Thứ 2 7là dành cho nhóm mà tập tin thuộc về nó, có nghĩa là nhóm cũng có tất cả các quyền đọc, ghi và thực thi.

Và thứ 3 7là cho phép người khác

Nếu bạn cấp quyền cho tệp 555thì tệp owner, group and otherschỉ có quyền readvà quyền vì quyền đọc có nghĩa là 4 và thực thi nghĩa là 1 nên tổng số đượcexecutenot write5


Nhóm là gì và những quyền khác là gì? Cảm ơn cho phản ứng.
địa ngục

Vui lòng tham khảo liên kết này cho nhóm và các quyền khác, những quyền này sẽ được thực thi trên bất kỳ ai khác trên máy chủ không phải là bạn hoặc không thuộc nhóm của bạn
Prakash V Holkar

7

Trong không nhiều từ như câu trả lời hàng đầu:

Mỗi tệp có 3 tùy chọn quyền: đọc, ghi và thực thi. Bạn có thể chọn không ai trong số này, một trong hai, hai trong số này hoặc tất cả trong số này:

C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8

1 + 3 + 3 + 1 = 8

Vì vậy, hoàn toàn, có 8 kết hợp; 8 tùy chọn cho phép. Đếm từ 0, số cuối cùng là 7 (từ 0 đến 7). Vì vậy, được biểu thị bằng số, đây là tất cả các tùy chọn:

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)

Có ba số vì thứ tự đi [quyền người dùng] [quyền nhóm] [quyền khác]

Vì vậy, 777 có nghĩa là cả ba nhóm đã đọc, viết và thực thi quyền.


Ngoài ra (liên quan gián tiếp để bạn không nhất thiết phải đọc phần này), vì tôi nghĩ rằng sự liên quan của nó rất quan trọng: Tại sao readsố 4 thay vì số 3?

0 - nothing
1 - execute
2 - write
3 - read
4 - execute + read (1 + 3)
5 - write + read (2 + 3)
6 - execute + write + read (3 + 2 + 1)
7 - ????? no way to get this with the 3 basic options (and we are missing execute + write)

Cách duy nhất để có được các kết hợp duy nhất cho tất cả các khả năng là sử dụng quyền hạn 2 cho các tùy chọn cơ bản. 2 0 = 1 (thực thi), 2 1 = 2 (ghi), 2 2 = 4 (đọc) và nếu có tùy chọn cơ bản thứ 4, nó sẽ được đánh số 2 3 = 8. Lưu ý rằng writekhông được liệt kê cho đến khi tất cả các kết hợp của các tùy chọn trước đó đã được liệt kê (chỉ là một tùy chọn, vì nó chỉ là execute). readkhông được liệt kê cho đến khi tất cả các kết hợp của các tùy chọn trước đó đã được liệt kê (một lần nữa, vì chỉ có một kết hợp với hai tùy chọn - execute+ write). execute+ write+readkhông được liệt kê cho đến khi tất cả các kết hợp trước đó được liệt kê, là 3, vì hiện tại có hai lựa chọn từ ba quyền. Danh sách này sẽ tiếp tục theo cách này, bất kể có bao nhiêu lựa chọn cơ bản. Ví dụ, với 4 tùy chọn cơ bản (lưu ý rằng chúng tôi cũng biết sẽ có tổng cộng 16 kết hợp vì có 4 tùy chọn và 2 4 = 16):

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
8 - love
9 - execute + love (1 + 8)
10 - write + love (2 + 8)
11 - execute + write + love (1 + 2 + 8)
12 - read + love (4 + 8)
13 - execute + read + love (1 + 4 + 8)
14 - write + read + love (2 + 4 + 8)
15 - execute + write + read + love (1 + 2 + 4 + 8)

6
Câu trả lời này hoàn toàn xấu vì nó không nhận ra hệ nhị phân và quan trọng hơn là hệ thống số bát phân là nguồn cho các bit cho phép tệp Unix. (Thật thú vị, chúng không phải là 3 hay thậm chí là 4, chúng là 6, mặc dù hiện tại toàn bộ 18 bit không được sử dụng.)
mirabilos

1
Cơ sở là không quan trọng, như 111 là 7; cho dù tôi nói rằng các quyền là 111 hay 7 không quan trọng, bởi vì nó là cùng một giá trị. Tôi đã sử dụng số thập phân cho đơn giản ví dụ để hiển thị toán học liên quan. Tôi có thể đã sử dụng nhị phân, nhưng toán học sẽ không nhìn đơn giản như vậy. Có vấn đề gì khi các căn cứ có thể được dịch giữa nhau?
Phường Daniel

4

Tôi ngạc nhiên rất nhiều câu trả lời tương tự mà hoàn toàn bỏ lỡ đánh dấu.

Sau khi xác định 3 lớp cần đọc, viết và thực thi. Họ đã đi với bát phân (3 bit) để giảm thiểu không gian cần thiết để quản lý hệ thống tệp .


3

Vì một số lý do, các nhà thiết kế UNIX đã quyết định sử dụng các số OCTAL để cấp quyền cho tệp. Như bạn đã biết, giá trị tối đa cho số bát phân một chữ số là 7. Hóa ra một chữ số bát phân cho người dùng truy cập, một cho truy cập nhóm và một cho truy cập thế giới là đủ cho hầu hết mọi thứ. Số bát phân 3digit tối đa là 777 và chỉ có nghĩa là nó biểu thị "quyền truy cập vào mọi người / mọi thứ".


Tôi không nghĩ rằng đây là một lời giải thích tốt. Các nhà thiết kế UNIX có thể có số thập phân và vẫn sẽ kết thúc với 7 biểu thị quyền truy cập tối đa, thay vì 9 (dưới dạng chữ số thập phân tối đa). Số 7 không được chọn "trừ" dựa trên những con số nào có thể bắt đầu từ chữ số đơn cao nhất có thể, nhưng "cộng" dựa trên quyền truy cập được cho phép bởi các chữ số nhị phân duy nhất bắt đầu từ 0 mà không có quyền nào cả.
HOẶC Mapper

Lưu ý rằng tôi đã viết rất "cầu xin" vì một số lý do "... - Tôi không muốn giải thích sâu hơn về lý do TẠI SAO họ chọn số bát phân, vì đó không phải là câu hỏi của OP. Câu hỏi là tại sao 777 cho tất cả các quyền.
DejanLekic

Ở đây không liên quan tại sao họ chọn số bát phân. Quan điểm của tôi là lý do các quyền tối đa được đại diện bởi số 7 không phải là 7 xảy ra là số bát phân tối đa.
HOẶC Mapper

2

Ngày nay, tất cả chúng ta đều biết rằng một byte là 8 bit : điều này đã được thống nhất trong nhiều thập kỷ. Nhưng điều đó không phải lúc nào cũng đúng, và Unix (đã truyền cảm hứng cho Linux theo nhiều cách) đã được viết trong thời gian mà điều này vẫn đang được tranh luận. Cụ thể, nó cần phải di động tới các hệ thống sử dụng byte 6 bit hoặc byte 8 bit. Một số người đã viết nó ở một bên của cuộc tranh luận, và những người khác ở phía bên kia.

Trên một lưu ý liên quan, Base-2 (nhị phân) không phải là một ký hiệu rất thuận tiện để viết ra các giá trị. Ngày nay, hầu hết các lập trình viên viết ra một ký hiệu nhỏ gọn hơn sử dụng Base-16 (thập lục phân) thay thế. 16 chỉ đủ lớn để có thể đóng gói chính xác bốn bit thành một chữ số hex: ví dụ: "0000" trong nhị phân là 0x0 theo hệ thập lục phân (rằng "0x" là một cách phổ biến để lưu ý rằng bạn sắp viết số thập lục phân), trong khi "1111" là 0xF (hoặc 15 ở dạng thập phân). Bạn thực sự có thể viết bất kỳ sự kết hợp nào của bốn bit bằng một chữ số hex, chỉ bằng cách đếm nhị phân và do cách thức số học vị trí hoạt động, bạn có thể xếp nó lên: hai chữ số hex có thể mã hóa bất kỳ tổ hợp tám bit nào có thể bằng cách đếm, v.v. Vì vậy, những người 8 bit yêu thích điều này.

Những người 6 bit có cách riêng của họ để làm điều này, nhưng thay vì sử dụng Base-16, họ đã sử dụng Base-8 (bát phân). Nó có những ưu điểm tương tự như hệ thập lục phân: bạn có thể lưu trữ bất kỳ vị trí nào của ba bit trong một chữ số bát phân và bạn có thể xếp các chữ số lên theo cách tương tự. Vì vậy, giống như folks 8 bit đã sử dụng hai chữ số hex cho một byte, folks 6 bit đã sử dụng hai chữ số bát phân cho một byte. Bạn không còn thấy bát phân nữa, nhưng nó thường được ghi chú bằng số 0 đứng đầu: ví dụ: "111" là 07 trong bát phân.

Bây giờ, tất cả những điều này có liên quan gì đến quyền hạn Unix? Theo như Unix có liên quan, có ba điều bạn có thể làm với một tệp: bạn có thể đọc nó, bạn có thể viết cho nó hoặc bạn có thể thực thi nó như một chương trình. Nếu bạn sẽ hạn chế điều đó bằng quyền, thì bạn cần một chút cho mỗi người trong số họ: bật nó lên cho những việc mà ai đó được phép làm và bỏ qua những việc mà ai đó không được phép làm. Vì có ba thứ đang được theo dõi, bạn cần ba bit và vì Unix theo dõi nó dọc theo ba dòng (chủ sở hữu, nhóm và tất cả mọi người) nên bạn cần tổng cộng chín bit.

Tại một số điểm trên đường, một người nào đó - có thể là trong trại 6 bit - nói "Này, chúng ta có thể sử dụng các chữ số bát phân cho việc này" . Và điều này hóa ra là một ký hiệu rất thuận tiện: ba chữ số bát phân là vừa đủ để mã hóa mọi sự kết hợp có thể có của các trường bit. Khi họ quyết định làm điều này, số phận của 777 (và 000) đã được niêm phong, bởi vì những con số đó sẽ giống nhau cho dù chúng có sắp xếp các bit như thế nào, nhưng thứ tự quan trọng đối với tất cả các số khác, vì vậy chúng bắt đầu thực hiện điều này.

Họ sắp xếp các quyền thành các trường ba bit: đọc ở đầu, viết ở giữa và thực hiện ở cuối. Sau đó, họ tự sắp xếp các trường: chủ sở hữu ở đầu, nhóm ở giữa và những người khác ở cuối. Khi họ đã thực hiện điều này, tất cả những gì họ phải làm để gán phần còn lại của các con số là tính.

Vì chúng là các trường 3 bit, bạn có thể nói rằng mỗi chữ số bát phân điều khiển một trong các trường : chữ số thứ nhất kiểm soát quyền của chủ sở hữu, chữ số thứ hai kiểm soát quyền của nhóm và chữ số thứ ba kiểm soát các quyền khác. Do đó, 777 (111 111 111) là tất cả các quyền cho tất cả mọi người, trong khi 700 (111 000 000) chỉ là tất cả các quyền cho chủ sở hữu. Các kết hợp khác cũng phổ biến: 666 (110 110 110) được đọc / ghi cho mọi người nhưng không thực thi), trong khi 555 (101 101 101) được đọc / thực thi cho mọi người nhưng không ghi và 400 (100 000 000) được đọc- chỉ dành cho chủ sở hữu và không có quyền truy cập cho bất cứ ai khác.

Và đó là lý do tại sao 777 có nghĩa là tất cả các quyền. Ngày nay, đó có lẽ là lý do phổ biến nhất để mọi người sử dụng bát phân, mặc dù Unix và hậu duệ của nó vẫn còn một vài dấu tích khác về nó. Ví dụ, odhay Octal Dump, là một cách để có được các tệp nhị phân của tệp ở dạng bát phân (nó có một người anh em thập lục phân, được gọi xxd, nhưng nó không nổi tiếng và không có sẵn ở mọi nơi). Đó cũng là lý do tại sao bạn cần cẩn thận với các số 0 đứng đầu trong một số ngôn ngữ lập trình, bởi vì họ có thể nghĩ rằng bạn có ý định viết số theo số bát phân khi đó không thực sự là ý định của bạn.


trước hết khi linux được tạo ra (khoảng năm 1992) Cuộc tranh luận 8 bit 6 bit đã kết thúc. Thứ 2 KHÔNG phải là lý do tại sao điều này được thực hiện
Ahmed Masud

1
Tôi đã cung cấp công cụ 8 bit / 6 bit cho bối cảnh lịch sử. Linux đã được tạo ra rất lâu sau khi cuộc tranh luận đó kết thúc, điều đó đúng, nhưng vì nó đã lấy quá nhiều cảm hứng từ Unix, nên nó đã bị ảnh hưởng bởi cuộc tranh luận đó theo những cách tương tự. Đây là lý do tại sao tôi nghĩ rằng nó sẽ là một ý tưởng tốt để giới thiệu bối cảnh lịch sử.
Chiếc thìa ngon nhất
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.