Mengapa 777 ditugaskan ke chmod untuk mengizinkan semua yang ada di file?

54

Saya ditanya dalam sebuah wawancara mengapa 777 ditugaskan untuk mengambil semua izin untuk sebuah file. Kenapa tidak 555? Dia mengatakan bahwa ada alasan untuk semuanya. Jadi, apa alasan 777? Kenapa tidak ada nomor lain? Apakah ada signifikansi dalam jumlah ini?

Halo sayang
sumber
2
Referensikan tautan komentar @ AvinashRaj & terapkan pada instance. Pertanyaan "mengapa?" tergantung pada instance apa itu & tujuan apa yang dilayaninya ... :)
AzkerM
1
Apakah dia bertanya tentang pentingnya angka 7 vs 5 atau mengapa angka itu bukan angka, misalnya huruf?
Braiam
4
Ini adalah pertanyaan wawancara yang bagus; Saya mungkin harus mencurinya.
Digital Chris
5
Sebenarnya, ini bukan 777, tapi 0777.
Ruslan

Jawaban:

129

Saya akan mencoba untuk membahas alasan mendasar mengapa itu adalah 777, bukan aaa, atau 999.

Ingatlah bahwa izin datang dalam format berikut:

 u   g   o
rwx rwx rwx

di mana u = pengguna, g = grup, o = lainnya.

Sekarang, bayangkan Anda mewakili masing-masing grup ini sebagai biner. 1 benar, 0 salah.

Jika Anda ingin memberikan akses penuh kepada semua orang, Anda akan menetapkan izin berikut dalam biner:

 u   g   o
rwx rwx rwx
111 111 111

Sekarang, jika Anda tahu biner, Anda akan menyadari bahwa ketika Anda mengonversi 111dari biner ke desimal, Anda mendapatkannya 7.

Dengan demikian, Anda dapat mewakili akses penuh sebagai 777.

Catatan: Kami benar-benar mengonversi dari biner ke oktal. Lihat hasil edit di bawah.

Ini bekerja untuk semua mode akses lainnya juga.

Sebagai contoh, kita dapat dengan mudah mengetahui apa 555artinya dengan mengonversikannya 5menjadi biner, dan menuliskannya dalam format di atas. 5dalam biner adalah 101, jadi kami memiliki izin berikut:

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

Demikian pula, jika kami ingin memberikan semua izin kepada pengguna, tetapi hanya mengizinkan orang lain untuk membaca, kami dapat menemukan representasi angka.

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

Sekarang, kita tahu bahwa 111dalam biner adalah 7dalam desimal, dan 100dalam biner adalah 4dalam desimal. Dengan demikian, izinnya adalah 744.

Sunting:

Secara teknis, seperti yang disorot oleh @ LưuVĩnhPhúc dan @Braiam, kami mengkonversi dari biner ke oktal, seperti dijelaskan di bawah ini. Namun, representasi desimal dan oktal dari angka <8 adalah sama, jadi untuk angka biner dengan 3 digit atau kurang, representasi desimal dan oktal sama.

Ketika direpresentasikan sebagai angka oktal, daripada membaginya menjadi tiga kelompok, dan melakukan konversi biner ke desimal pada masing-masing grup, Anda dapat benar-benar menggabungkan ketiga grup menjadi satu angka biner, dan mengonversinya menjadi oktal.

Misalnya, berikut adalah beberapa konversi biner ke oktal:

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

Perhatikan bahwa saya menambahkan "0b" dan "0o" untuk membedakan antara angka biner dan oktal.

Jika Anda ingin bermain-main dengan ini, buka terminal, jalankan pythondan kemudian mainkan dengan perintah berikut:

oct(0b111111111)
bin(0o555)

Ingatlah untuk menambahkan "0b" atau "0o" ke angka-angka agar komputer tahu basis apa yang Anda minati. (Jika tidak, ia akan menganggap basis 10.)

daviewales
sumber
17
Hanya demi kelengkapan, format angka disebut oktal yang secara harfiah berarti basis 8 (karena mereka mulai dari 0 adalah 7 + 1 = 8).
Braiam
3
davie: oktal mudah karena sebenarnya mengelompokkan tiga bit, sama seperti kelompok heksadesimal empat. Desimal bukan kekuatan 2, sehingga tidak mengelompokkan bit dengan baik.
Konerak
2
Nah, Anda mendapatkan nomor yang sama dalam kedua kasus. Saya pikir itu lebih mungkin bahwa seseorang akan memahami konversi biner ke desimal daripada konversi biner ke oktal. Juga, saya telah menambahkan bagian di akhir untuk memperjelas bahwa jumlahnya benar-benar oktal, bukan desimal.
daviewales
3
7adalah sama dalam desimal dan oktal - namun, 777tidak. Ketika Anda berbicara tentang membalik bit, itu membuat perbedaan.
Sam Dufel
2
Hanya demi sepele 7 disebut sebagai Nomor Tuhan dan pengguna root, yang izin default 777kadang-kadang disebut sebagai Tuhan.
eyoung100
16

Membaca izin file berarti 4, menulis izin file berarti 2dan melaksanakan izin file berarti 1.

Jadi totalnya adalah ini 7.

Sekarang apa 777: pertama 7adalah untuk pemilik file yang berarti pemilik file telah membaca, benar dan menjalankan izin.

2 7adalah untuk grup yang dimiliki file tersebut, itu berarti grup juga memiliki semua izin baca, tulis, dan eksekusi.

Dan ke 7- 3 untuk izin orang lain

Jika Anda memberikan izin file, 555maka file owner, group and otherstersebut hanya memiliki readdan executeizin not writeizin karena izin baca berarti 4 dan mengeksekusi berarti 1 sehingga total mendapat5

Prakash V Holkar
sumber
Apa itu grup dan apa itu izin lainnya? Terima kasih atas tanggapannya.
hellodear
Silakan merujuk tautan ini untuk grup dan izin lainnya, ini akan diberlakukan pada siapa pun di server yang bukan Anda atau tidak dalam grup Anda
Prakash V Holkar
7

Dengan tidak banyak kata sebagai jawaban teratas:

Setiap file memiliki 3 opsi izin: membaca, menulis, dan mengeksekusi. Anda dapat memilih tidak satu pun dari ini, salah satunya, dua di antaranya, atau semuanya:

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

1 + 3 + 3 + 1 = 8

Jadi, secara keseluruhan, ada 8 kombinasi; 8 opsi untuk izin. Menghitung dari 0, angka terakhir adalah 7 (dari 0 hingga 7). Jadi, diwakili oleh angka, berikut ini semua opsi:

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)

Ada tiga angka karena urutannya [izin pengguna] [izin grup] [izin lain]

Jadi, 777 berarti bahwa ketiga grup telah membaca, menulis, dan mengeksekusi izin.


Juga (terkait secara tidak langsung sehingga Anda tidak perlu membaca bagian ini), karena saya pikir relevansinya penting: Mengapa readnomor 4 dan bukan nomor 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)

Satu-satunya cara untuk mendapatkan kombinasi unik untuk semua kemungkinan adalah menggunakan kekuatan 2 untuk opsi dasar. 2 0 = 1 (jalankan), 2 1 = 2 (tulis), 2 2 = 4 (baca), dan jika ada opsi dasar ke-4 itu akan diberi nomor 2 3 = 8. Catatan yang writetidak terdaftar sampai semua kombinasi dari opsi sebelumnya telah terdaftar (yang hanya satu opsi, karena hanya saja execute). readtidak terdaftar sampai semua kombinasi opsi sebelumnya telah terdaftar (sekali lagi satu, karena hanya ada satu kombinasi dengan dua opsi - execute+ write). execute+ write+readtidak terdaftar sampai semua kombinasi sebelumnya terdaftar, yaitu 3, karena sekarang ada dua pilihan dari tiga izin. Daftar akan berlanjut dengan cara ini, tidak peduli berapa banyak opsi dasar yang ada. Sebagai contoh, dengan 4 opsi dasar (perhatikan bahwa kami juga tahu akan ada total 16 kombinasi karena ada 4 opsi dan 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)
Daniel Ward
sumber
6
Jawaban ini benar - benar buruk karena gagal mengenali biner dan, yang lebih penting, sistem angka oktal sebagai sumber untuk bit izin file Unix. (Lucunya, mereka bukan 3 atau bahkan 4 ... mereka 6, meskipun bit 18 penuh tidak digunakan saat ini.)
mirabilos
1
Basis tidak penting, karena 111 adalah 7; apakah saya mengatakan bahwa izin adalah 111 atau 7 tidak masalah, karena itu adalah nilai yang sama. Saya menggunakan desimal untuk kesederhanaan contoh untuk menunjukkan matematika yang terlibat. Saya bisa menggunakan biner, tetapi matematika tidak akan terlihat langsung. Apa bedanya ketika pangkalan dapat diterjemahkan antara satu sama lain?
Daniel Ward
4

Saya terkejut begitu banyak jawaban serupa yang sama sekali meleset dari sasaran.

Setelah menentukan 3 kelas yang dibutuhkan baca, tulis, dan eksekusi. Mereka pergi dengan oktal (3 bit) untuk meminimalkan ruang yang dibutuhkan untuk mengelola sistem file .

Tidak unik
sumber
3

Untuk beberapa alasan, desainer UNIX memutuskan untuk menggunakan nomor OCTAL untuk izin file. Seperti yang Anda ketahui, nilai maksimum untuk satu digit angka oktal adalah 7. Ternyata satu digit oktal untuk akses pengguna, satu untuk akses grup dan satu untuk akses dunia sudah cukup untuk hampir semuanya. Jumlah oktal 3digit maksimum adalah 777, dan itu hanya masuk akal bahwa itu menandakan "akses ke semua orang / segalanya".

DejanLekic
sumber
Saya pikir ini bukan penjelasan yang bagus. Desainer UNIX dapat memiliki angka desimal dan masih akan berakhir dengan 7 yang menunjukkan akses maksimum, bukan 9 (sebagai angka desimal maksimum). Angka 7 tidak dipilih "kurang" berdasarkan angka apa yang mungkin dimulai dari satu digit tertinggi, tetapi "secara tambahan" berdasarkan pada akses yang diizinkan oleh digit biner tunggal mulai dari nol tanpa hak sama sekali.
ATAU Mapper
Perhatikan saya menulis di awal "untuk beberapa alasan" ... - Saya tidak ingin masuk ke penjelasan yang lebih dalam tentang MENGAPA mereka memilih angka oktal, karena itu bukan pertanyaan OP. Pertanyaannya adalah mengapa 777 memberikan semua izin.
DejanLekic
Tidak relevan di sini mengapa mereka memilih angka oktal. Maksud saya adalah bahwa alasan bahwa hak maksimum diwakili oleh angka 7 bukanlah bahwa 7 kebetulan merupakan angka oktal maksimum.
ATAU Mapper
2

Saat ini, kita semua tahu bahwa byte adalah 8 bit : ini telah disepakati secara universal selama beberapa dekade. Tapi itu tidak selalu terjadi, dan Unix (yang mengilhami Linux dalam banyak hal) ditulis pada saat ini masih diperdebatkan. Secara khusus, itu perlu portabel untuk sistem yang menggunakan 6-bit byte atau 8-bit. Beberapa orang yang menulisnya ada di satu sisi perdebatan, dan yang lain di sisi lain.

Pada catatan terkait, Basis-2 (biner) bukan notasi yang sangat nyaman untuk menuliskan nilai. Saat ini, sebagian besar programmer menulis notasi yang lebih kompak yang menggunakan Base-16 (hexadecimal) sebagai gantinya. 16 adalah basis yang cukup besar sehingga Anda bisa mengemas empat bit menjadi satu hex-digit: misalnya, "0000" dalam biner adalah 0x0 dalam heksadesimal ("0x" adalah cara umum untuk mencatat bahwa Anda akan tulis angka heksadesimal), sedangkan "1111" adalah 0xF (atau 15 dalam desimal). Anda benar-benar dapat menulis kombinasi yang mungkin dari empat bit menggunakan satu digit hex tunggal, hanya dengan menghitung dalam biner, dan karena cara kerja aritmatika posisional, Anda dapat menumpuknya: dua digit hex dapat mengkodekan kemungkinan kombinasi dari delapan bit, hanya dengan menghitung, dan seterusnya. Jadi orang 8-bit menyukai ini.

Orang-orang 6-bit memiliki cara mereka sendiri untuk melakukan ini, tetapi alih-alih menggunakan Basis-16, mereka menggunakan Basis-8 (oktal). Ini memiliki keuntungan yang mirip dengan heksadesimal: Anda dapat menyimpan posisi tiga bit dalam digit oktal, dan Anda dapat menumpuk angka dengan cara yang sama. Jadi seperti halnya orang-orang 8-bit menggunakan dua digit hex untuk byte, orang-orang 6-bit menggunakan dua digit oktal untuk byte. Anda tidak melihat oktal lagi, tetapi biasanya dicatat dengan nol di depan: misalnya, "111" adalah 07 dalam oktal.

Sekarang, apa hubungannya semua ini dengan izin Unix? Sejauh menyangkut Unix, ada tiga hal yang bisa Anda lakukan dengan file: Anda bisa membacanya, Anda bisa menulis ke sana, atau Anda bisa menjalankannya sebagai sebuah program. Jika Anda akan membatasi itu dengan izin, maka Anda perlu sedikit untuk masing-masing: nyalakan untuk hal-hal yang boleh dilakukan seseorang, dan tinggalkan untuk hal-hal yang tidak boleh dilakukan seseorang. Karena ada tiga hal yang dilacak, Anda memerlukan tiga bit, dan karena Unix melacaknya sepanjang tiga baris (pemilik, grup, dan semua orang), Anda membutuhkan total sembilan bit.

Pada titik tertentu, seseorang - mungkin di camp 6-bit - berkata, "Hei, kita bisa menggunakan digit oktal untuk ini" . Dan ini ternyata menjadi notasi yang sangat nyaman: tiga digit oktal hanya cukup untuk menyandikan setiap kombinasi yang mungkin dari bidang bit. Begitu mereka memutuskan untuk melakukan ini, nasib 777 (dan 000) disegel, karena angka-angka itu akan sama tidak peduli bagaimana mereka mengatur bit, tetapi pesanan penting untuk semua angka lainnya, jadi mereka mulai melakukan ini.

Mereka mengatur izin menjadi bidang tiga-bit: membaca di awal, menulis di tengah, dan mengeksekusi di akhir. Kemudian mereka mengatur ladang sendiri: pemilik di awal, kelompok di tengah, dan yang lainnya di akhir. Setelah mereka melakukan ini, yang harus mereka lakukan untuk menetapkan sisa angka adalah hitung.

Karena itu adalah bidang 3-bit, Anda dapat mengatakan bahwa setiap digit oktal mengontrol salah satu bidang : digit pertama mengontrol izin pemilik, digit kedua mengontrol izin grup, dan digit ketiga mengontrol izin lainnya. Dengan demikian, 777 (111 111 111) adalah semua izin untuk semua orang, sedangkan 700 (111 000 000) adalah semua izin hanya untuk pemilik. Kombinasi lain juga umum: 666 (110 110 110) dibaca / ditulis untuk semua orang tetapi tidak dieksekusi), sedangkan 555 (101 101 101) dibaca / dieksekusi untuk semua orang tetapi tidak menulis, dan 400 (100 000 000) dibaca- hanya untuk pemilik dan tidak ada akses untuk orang lain.

Dan itu sebabnya 777 berarti semua izin. Saat ini, itu mungkin alasan paling populer bagi orang untuk menggunakan oktal sama sekali, meskipun Unix dan turunannya masih memiliki beberapa sisa lainnya. Sebagai contoh,, odatau Octal Dump, adalah cara untuk mendapatkan kesedihan biner dari file dalam bentuk oktal (memiliki sepupu heksadesimal, disebut xxd, tetapi itu tidak begitu terkenal dan tidak tersedia di mana-mana). Itu juga mengapa Anda harus berhati-hati dengan memimpin nol dalam beberapa bahasa pemrograman, karena mereka mungkin berpikir bahwa Anda berniat untuk menulis angka dalam oktal ketika itu sebenarnya bukan niat Anda.

Spooniest
sumber
pertama-tama ketika linux dibuat (sekitar tahun 1992) 8-bit 6-bit debat sudah berakhir. Kedua, BUKAN alasan mengapa ini dilakukan
Ahmed Masud
1
Saya menyediakan barang 8-bit / 6-bit untuk konteks sejarah. Linux dibuat lama setelah perdebatan itu berakhir, itu benar, tetapi karena ia menarik begitu banyak inspirasi dari Unix, itu dipengaruhi oleh perdebatan itu dengan cara yang sama. Inilah mengapa saya pikir itu akan menjadi ide yang baik untuk memperkenalkan konteks sejarah.
The Spooniest