Có sự khác biệt nào giữa giá trị chế độ 0777 và 777 không


51

Tôi đã thấy một sự thay đổi mã tại nơi làm việc, trong đó các giá trị chế độ được thay đổi từ 777 thành 0777 để làm cho nfs setattr hoạt động. Sự khác biệt trong 2 giá trị là gì?



Đã giải quyết vấn đề tương tự trong khi sử dụng các hàm liên quan đến FS tích hợp sẵn như php mkdir(). 0777 vs 777
Niket Pathak

Câu trả lời:


76

Nếu bạn chuyển chúng đến chmod(chương trình dòng lệnh), không có sự khác biệt. Nhưng trong một chương trình C hoặc tương tự, 0777là bát phân (ba bộ ba 1 bit, đó là những gì bạn dự định), trong khi đó 777là số thập phân và đó là một mẫu bit hoàn toàn khác. ( chmodsẽ diễn giải bất kỳ đối số số nào dưới dạng bát phân, do đó không cần số 0 đứng đầu.)

0777 (bát phân) == binary 0b 111 111 111    == quyền rwxrwxrwx   (== thập phân 511)

777 (thập phân) == binary 0b 1 100 001 001== quyền sr----x--x(== bát phân 1411)


14
Nói rõ hơn - giá trị bạn truyền cho chmodlệnh luôn được hiểu là bát phân. Sử dụng chmod 888sẽ cho một lỗi.
mattdm

nhưng mỗi chữ số là số bát phân, không phải là toàn bộ số.
Drake Clarris

1
Một chuỗi các chữ số bát phân một số bát phân. chmoddiễn giải một đối số số là bát phân, bất kể tiền tố. (Nhưng thực sự số đó không có chức năng; chỉ là các chữ số, hay đúng hơn là các bit.)
alexis

Vì vậy, trong một chương trình C, nếu bạn muốn vượt qua 1777, bạn cần phải viết 01777?
Faheem Mitha

1
@Faheem, đúng vậy. Octal 1777được viết bằng 01777C. (Hoặc bạn có thể viết 1023, đó là cùng một số thập phân. Nhưng đừng :-)
alexis

4

Bit đầu tiên được sử dụng cho bit dính http://en.wikipedia.org/wiki/Sticky_bit

Nếu bạn đặt quyền sử dụng 4 chữ số, đầu tiên sẽ đặt hoặc xóa bit này.


3
Bit dính không phải là bit đầu tiên mà là bit thứ ba. Đầu tiên là bit suid và thứ hai là sgid. Nếu bạn đặt quyền sử dụng ba chữ số, chữ số đầu tiên bị thiếu cũng sẽ ảnh hưởng (tức là loại bỏ) ba bit này.
jlliagre

Bạn đúng rồi. Ergo, "câu trả lời được cung cấp bởi alexis là vắt.
alfredocambera

2
@jlliagre Từ trang man chmod - "Các chữ số bị bỏ qua được coi là số 0 đứng đầu." Ngoài ra, chữ số đầu tiên của 4 bit dính. Từ trang man một lần nữa: "Chữ số đầu tiên chọn ID người dùng đã đặt (4) và đặt ID nhóm (2) và các thuộc tính xóa bị hạn chế hoặc dính (1). Chữ số thứ hai chọn quyền cho người dùng sở hữu tệp: read ( 4), viết (2) và thực thi (1); người thứ ba chọn quyền cho người dùng khác trong nhóm của tệp, với cùng các giá trị và thứ tư cho người dùng khác không thuộc nhóm của tệp, có cùng giá trị. ".
Faheem Mitha

1
@FaheemMitha, các chữ số bị bỏ qua được coi là số 0 đứng đầu, do đó sẽ loại bỏ các bit nói trên. Ngoài ra, bạn dường như nhầm lẫn các bit và chữ số, tôi đã nhận xét về bit đầu tiên, không phải chữ số đầu tiên.
jlliagre

1
@jlliagre Ok, đủ công bằng.
Faheem Mitha

1

Câu trả lời thú vị là:

  • không có sự khác biệt giữa 0700700, như được giải thích trong các câu trả lời khác
  • nhưng có một sự khác biệt giữa 007000700(đối với thư mục)

Ít nhất đó là trường hợp cho phiên bản chmod của GNU coreutils, vốn là mặc định trên Linux.

Xem ví dụ này:

$ ls -ld mydir
drws--s--- 4 myuser mygroup 4096 Jul  8 09:27 mydir
$ chmod 0710 mydir ; ls -ld mydir                   # surprise ahead -- s-bits remain:
drws--s--- 4 myuser mygroup 4096 Jul  8 09:27 mydir
$ chmod 00710 mydir ; ls -ld mydir                  # _now_ they're gone:
drwx--x--- 4 myuser mygroup 4096 Jul  8 09:27 mydir

Điều này là để tránh việc vô tình xóa các bit setuid / setgid cho các thư mục. Để biết chi tiết, xem tài liệu chmod .


-1

Trong hệ thống Linux, có hai loại quyền có sẵn:

  1. Quyền tập tin
  2. Sự cho phép đặc biệt

Trong quyền Tệp, chúng tôi đặt quyền trên tệp và thư mục:

Các quyền là:

  • đọc (4)
  • viết (2)
  • thực hiện (1)

Trong khi trong sự cho phép đặc biệt, ba loại quyền là:

  • BỀN (4)
  • SGID (2)
  • Bit dính (1)

Trong câu hỏi của bạn, bạn hỏi sự khác biệt là gì, vì vậy không có sự khác biệt nào giữa chmod 777 and 0777vì có no any octal valuegiá trị hiển thị là (0) không.

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.