มีความแตกต่างระหว่างค่าโหมด 0777 และ 777 หรือไม่


50

ฉันเห็นการเปลี่ยนแปลงรหัสในที่ทำงานซึ่งค่าโหมดถูกเปลี่ยนจาก 777 เป็น 0777 เพื่อให้ nfs setattr ทำงาน ความแตกต่างใน 2 ค่าคืออะไร?



มาข้ามปัญหาเดียวกันในขณะที่ใช้ฟังก์ชั่น PHP FS mkdir()ที่เกี่ยวข้องเช่น 0777 เทียบกับ 777
Niket Pathak

คำตอบ:


75

หากคุณกำลังส่งพวกเขาไปที่chmod(โปรแกรมบรรทัดคำสั่ง) จะไม่มีความแตกต่าง แต่ในโปรแกรม C หรือคล้ายกัน0777คือ octal (สามชุดสามบิต 1 ซึ่งเป็นสิ่งที่คุณตั้งใจ) ในขณะที่777เป็นทศนิยมและมันเป็นรูปแบบบิตที่แตกต่างกันมาก ( chmodจะตีความอาร์กิวเมนต์ตัวเลขใด ๆ เป็นฐานแปดจึงไม่จำเป็นต้องมีศูนย์นำหน้า)

0777 (ฐานแปด) == ไบนารี0b 111 111 111    == สิทธิ์rwxrwxrwx   (== ทศนิยม511)

777 (ฐานสิบ) == ไบนารี0b 1 100 001 001== การอนุญาตsr----x--x(== ฐานแปด1411)


14
เพื่อให้ชัดเจน - ค่าที่คุณส่งไปยังchmodคำสั่งจะถูกตีความว่าเป็นเลขฐานแปดเสมอ การใช้chmod 888จะทำให้เกิดข้อผิดพลาด
mattdm

แต่แต่ละหลักคือเลขฐานแปดไม่ใช่จำนวนเต็มทั้งหมด
Drake Clarris

1
สตริงของตัวเลขฐานแปดคือตัวเลขฐานแปด chmodตีความอาร์กิวเมนต์ตัวเลขเป็นฐานแปดโดยไม่คำนึงถึงคำนำหน้า (แต่จริงๆแล้วตัวเลขนั้นไม่มีฟังก์ชั่นเพียงแค่ตัวเลขหรือมากกว่าบิต)
alexis

ดังนั้นในโปรแกรม C หากคุณต้องการผ่าน1777คุณต้องเขียน01777?
Faheem Mitha

1
@Faheem นั่นถูกต้องแล้ว Octal 1777เขียนเป็น01777C (หรือคุณสามารถเขียน1023ซึ่งเป็นตัวเลขเดียวกันในทศนิยม แต่อย่า :-)
alexis

4

บิตแรกใช้สำหรับบิตที่เหนียวhttp://en.wikipedia.org/wiki/Sticky_bit

หากคุณตั้งค่าการอนุญาตโดยใช้ 4 หลักตัวแรกจะตั้งค่าหรือลบบิตนี้


3
บิตเหนียวไม่ใช่บิตแรก แต่เป็นบิตที่สาม อันแรกคือ suid bit และอันที่สอง sgid หนึ่ง หากคุณตั้งค่าการอนุญาตโดยใช้ตัวเลขสามหลักตัวเลขแรกที่หายไปจะมีผลกับ (เช่นลบ) สามบิตเหล่านี้
jlliagre

คุณพูดถูก ดังนั้น, "คำตอบที่ได้รับจาก alexis คือ wring.
alfredocambera

2
@jlliagre จากหน้าคน chmod - "ตัวเลขที่ละเว้นจะถือว่าเป็นศูนย์นำหน้า" นอกจากนี้ตัวเลขแรกของ 4 คือบิตเหนียว จากหน้า man อีกครั้ง: "ตัวเลขตัวแรกเลือก ID ผู้ใช้ชุด (4) และตั้งค่า ID กลุ่ม (2) และการลบแบบ จำกัด หรือคุณสมบัติเหนียว (1) ตัวเลขที่สองจะเลือกการอนุญาตสำหรับผู้ใช้ที่เป็นเจ้าของไฟล์: read ( 4), เขียน (2), และดำเนินการ (1); ตัวที่สามจะเลือกการอนุญาตสำหรับผู้ใช้รายอื่นในกลุ่มของไฟล์ที่มีค่าเท่ากันและที่สี่สำหรับผู้ใช้อื่นที่ไม่ได้อยู่ในกลุ่มของไฟล์ด้วยค่าเดียวกัน ".
Faheem Mitha

1
@FaheemMitha ตัวเลขที่ละเว้นจะถือว่าเป็นศูนย์นำหน้าดังนั้นจะลบบิตดังกล่าวข้างต้น นอกจากนี้คุณดูเหมือนจะสับสนบิตและตัวเลขฉันแสดงความคิดเห็นเกี่ยวกับบิตแรกไม่ใช่ตัวเลขแรก
jlliagre

1
@jlliagre ตกลงยุติธรรมพอ
Faheem Mitha

1

คำตอบที่น่าสนใจคือ:

  • ไม่มีความแตกต่างระหว่าง0700และ700ตามที่อธิบายไว้ในคำตอบอื่น ๆ
  • แต่มีคือความแตกต่างระหว่าง00700และ0700(ไดเรกทอรี)

อย่างน้อยในกรณีของ GNU coreutils รุ่น chmod ซึ่งเป็นค่าเริ่มต้นบน Linux

ดูตัวอย่างนี้:

$ 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

นี่คือเพื่อหลีกเลี่ยงการลบโดยไม่ตั้งใจของ setuid / setgid บิตสำหรับไดเรกทอรี สำหรับรายละเอียดโปรดดูเอกสารchmod


-1

ในระบบ Linux มีการอนุญาตให้ใช้ได้สองประเภท:

  1. การอนุญาตไฟล์
  2. การอนุญาตพิเศษ

ในการอนุญาตไฟล์เรากำหนดสิทธิ์สำหรับไฟล์และโฟลเดอร์:

สิทธิ์คือ:

  • อ่าน (4)
  • เขียน (2)
  • ดำเนินการ (1)

ในขณะที่อยู่ในการอนุญาตพิเศษสามประเภทคือ:

  • SUID (4)
  • SGID (2)
  • Sticky Bit (1)

ในคำถามของคุณคุณถามว่าอะไรคือความแตกต่างดังนั้นจึงไม่มีความแตกต่างใด ๆchmod 777 and 0777เนื่องจากมีno any octal valueค่าที่แสดงเป็นศูนย์ (0)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.