chmod 755 vs u+x: Mode Numerik dan Simbolis
Pahami chmod 755 dan u+x, arti angka oktal serta bentuk u/g/o. Ketahui mengapa mode numerik rekursif merusak struktur izin dan cara capital X mencegahnya.
Apa yang diubah chmod
chmod mengubah bit izin pada file atau direktori. Perintah ini menerima bit tersebut dalam salah satu dari dua notasi. Bentuk numerik menggunakan angka oktal yang menggantikan semua bit izin sekaligus. Bentuk simbolis menyebutkan kelas pengguna dan operator, lalu hanya mengubah bit yang disebutkan. Keduanya berakhir pada system call yang sama. Perbedaannya terletak pada bit yang tidak disebutkan.
Membaca mode dan mengubah mode adalah dua tugas yang berbeda. Jika huruf dalam long listing belum jelas, baca arti drwxr-xr-x menurut setiap bidang terlebih dahulu. Panduan ini hanya mengubahnya.
Jalankan semua perintah di sini sebagai pengguna login biasa. Akun root melewati pemeriksaan ini, sehingga demonstrasi izin yang dijalankan sebagai root tidak membuktikan apa pun. Jika Anda masih bekerja sebagai root pada server baru, buat pengguna normal dengan hak akses minimum, lalu kembali ke sini.
Siapkan sandbox yang dapat Anda hapus
cd "$(mktemp -d)"
touch notes.txtmktemp -d membuat direktori kosong di bawah /tmp dan mencetak path yang dibuatnya, lalu substitusi perintah meneruskan path tersebut langsung ke cd. Tidak ada perintah di bawah ini yang menyentuh file penting bagi Anda.
Satu perintah melaporkan hasil setiap perubahan:
stat -c '%a %A %n' notes.txt%a mencetak mode sebagai angka oktal, %A mencetak mode yang sama dalam bentuk huruf seperti yang digunakan oleh daftar panjang, dan %n mencetak namanya. Pada blok berikutnya, baris yang diawali $ adalah perintah yang Anda ketik, dan baris di bawahnya adalah output yang dicetak oleh perintah tersebut. Jalankan sendiri. Output pada mesin Anda seharusnya sama persis baris demi baris karena mode numerik tidak bergantung pada apa pun di lingkungan Anda.
Bentuk numerik: satu digit oktal untuk setiap kelas
Digit pertama berlaku untuk pemilik file. Digit kedua berlaku untuk group file. Digit ketiga berlaku untuk pengguna lain. Setiap digit merupakan jumlah nilai, satu nilai untuk setiap bit. Aktifkan satu bit setiap kali, lalu baca hasil yang dilaporkan stat.
$ chmod 400 notes.txt
$ stat -c '%a %A %n' notes.txt
400 -r-------- notes.txt
$ chmod 200 notes.txt
$ stat -c '%a %A %n' notes.txt
200 --w------- notes.txt
$ chmod 100 notes.txt
$ stat -c '%a %A %n' notes.txt
100 ---x------ notes.txtHuruf-huruf tersebut sesuai dengan digitnya. Setelah karakter pertama yang menunjukkan tipe file, tiga huruf pertama adalah milik pemilik, tiga huruf berikutnya adalah milik group, dan tiga huruf terakhir adalah milik pengguna lain. Jumlahkan nilainya untuk menggabungkan bit dalam satu kelas.
$ chmod 600 notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txt
$ chmod 700 notes.txt
$ stat -c '%a %A %n' notes.txt
700 -rwx------ notes.txt
$ chmod 750 notes.txt
$ stat -c '%a %A %n' notes.txt
750 -rwxr-x--- notes.txtMode numerik bersifat absolut. Mode ini menulis semua sembilan bit setiap kali dijalankan, sehingga kelas yang tidak pernah Anda pertimbangkan pun ikut ditulis.
$ chmod 755 notes.txt
$ stat -c '%a %A %n' notes.txt
755 -rwxr-xr-x notes.txt
$ chmod 600 notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txtPerintah kedua tidak menyebutkan group atau pengguna lain, tetapi bit milik keduanya tetap berubah. Inilah karakteristik bentuk numerik dan alasan bentuk numerik bukan alat yang tepat untuk perubahan kecil. (chmod juga menangani bit setuid, setgid, dan sticky, yang berada dalam digit keempat sebelum digit-digit ini. Itu merupakan topik terpisah, dan panduan ini hanya membahas tiga digit tersebut.)
Bentuk simbolis: kelas, operator, lalu bit
Tulis kelas terlebih dahulu. u adalah pemilik, g adalah grup, o adalah pengguna lain, dan a adalah semuanya sekaligus. Berikutnya, tulis operator: + menambahkan bit, - menghapus bit, dan = menetapkan kelas tersebut tepat sesuai bit yang Anda cantumkan serta menghapus bit lainnya pada kelas itu. Setelah itu, tulis bitnya sebagai r, w, atau x.
$ chmod 640 notes.txt
$ stat -c '%a %A %n' notes.txt
640 -rw-r----- notes.txt
$ chmod u+x notes.txt
$ stat -c '%a %A %n' notes.txt
740 -rwxr----- notes.txt
$ chmod g-r notes.txt
$ stat -c '%a %A %n' notes.txt
700 -rwx------ notes.txt
$ chmod o=r notes.txt
$ stat -c '%a %A %n' notes.txt
704 -rwx---r-- notes.txtSetiap perintah hanya memengaruhi satu kelas dan membiarkan kelas lainnya tetap seperti semula. Gabungkan klausa dengan koma tanpa spasi. chmod menerapkannya dari kiri ke kanan.
$ chmod u=rw,go=r notes.txt
$ stat -c '%a %A %n' notes.txt
644 -rw-r--r-- notes.txt
$ chmod go= notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txtgo= tanpa apa pun setelah tanda sama dengan menghapus semua bit dari grup dan pengguna lain. Bentuk ini sesuai untuk file yang hanya boleh dibaca oleh pemiliknya, seperti bagian privat dari pasangan kunci SSH.
chmod juga dapat melaporkan hasil kerjanya sendiri. Ini berguna dalam script ketika tidak ada orang yang memantau layar.
chmod -v u+x notes.txt
chmod -v u+x notes.txt-v mencetak satu baris untuk setiap file yang diberikan kepadanya. Jalankan kedua perintah tersebut dan bandingkan kedua baris pada layar Anda: baris pertama mencantumkan nama file serta melaporkan mode sebelum dan sesudah diubah, sedangkan baris kedua melaporkan bahwa mode dipertahankan karena bit yang hendak ditambahkan sudah ditetapkan. -c hanya mencetak baris jika file benar-benar berubah. Karena itu, opsi ini lebih sesuai untuk disimpan dalam log.
chmod 755 vs u+x: notasi mana yang digunakan
Mulai dengan file yang sama sebanyak 2 kali, lalu bandingkan hasil yang ditinggalkan oleh setiap notasi.
$ chmod 640 notes.txt
$ chmod 755 notes.txt
$ stat -c '%a %A %n' notes.txt
755 -rwxr-xr-x notes.txt
$ chmod 640 notes.txt
$ chmod u+x notes.txt
$ stat -c '%a %A %n' notes.txt
740 -rwxr----- notes.txtKedua perintah membuat file dapat dieksekusi oleh pemiliknya. Hanya salah satunya yang membiarkan 2 kelas lainnya tetap seperti semula. Gunakan mode numerik jika Anda mengetahui keadaan akhir yang tepat dan ingin memaksakannya. Ini merupakan pilihan yang tepat dalam deployment script yang harus menghasilkan hasil yang sama pada mesin yang belum pernah Anda lihat. Gunakan mode simbolik jika kalimat dalam pikiran Anda memuat add atau remove, karena bentuk numerik tidak dapat menyatakan leave that part alone.
Mode yang digunakan oleh file baru saat dibuat sama sekali tidak berasal dari chmod. Mode tersebut berasal dari umask proses yang membuat file. Jalankan umask dan umask -S di shell Anda sendiri untuk melihat nilai yang berlaku di sana. Nilai tersebut dapat berbeda antar-distribusi, antara login shell dan service systemd, serta antara satu akun dan akun lainnya. umask menentukan mode setiap file baru, sehingga umask menentukan kondisi awal sebelum chmod dijalankan.
Fungsi bit execute pada direktori
Ini adalah kesalahpahaman yang paling banyak membuang waktu. Pada file biasa, bit execute berarti kernel dapat menjalankan file tersebut. Direktori tidak menyimpan instruksi, sehingga tidak ada yang dapat dijalankan di dalamnya. Pada direktori, bit execute berarti traversal: izin untuk me-resolve nama di dalamnya. Untuk mencapai dir/file, Anda memerlukan izin tersebut pada dir. Bit read adalah izin yang terpisah dan memungkinkan Anda membuat daftar nama yang disimpan direktori. Anda dapat memiliki salah satunya tanpa yang lain. Hal ini lebih mudah dipahami setelah Anda melihatnya terjadi.
$ mkdir vault
$ printf 'hello\n' > vault/secret.txt
$ chmod 600 vault/secret.txt
$ chmod 100 vault
$ echo vault/*
vault/*
$ cat vault/secret.txt
helloShell mencetak kembali pola tersebut tanpa perubahan karena memperluas vault/* berarti membaca direktori, dan glob yang tidak cocok dengan apa pun diteruskan sebagai teks literal, bukan menghasilkan error. cat tetap berhasil karena Anda memberikan namanya sendiri dan traversal diizinkan. Sekarang tukar kedua bit tersebut.
$ chmod 400 vault
$ echo vault/*
vault/secret.txt
$ cat vault/secret.txt
cat: vault/secret.txt: Permission deniedNama-namanya terlihat, tetapi isinya tidak. Read memberi Anda daftarnya. Execute memberi Anda akses untuk masuk. Hampir setiap direktori yang Anda gunakan memerlukan keduanya.
$ chmod 500 vault
$ cat vault/secret.txt
helloMengapa chmod -R dengan mode numerik merusak suatu hierarki
-R menelusuri seluruh hierarki dan menerapkan mode yang Anda berikan pada semua objek yang ditemuinya. Direktori dan file data memerlukan bit yang berbeda, sehingga satu angka absolut tidak dapat benar untuk keduanya. Buat hierarki kecil dan amati kesalahannya.
$ mkdir -p site/css
$ touch site/index.html site/css/main.css
$ printf '#!/bin/bash\necho hi\n' > site/deploy.sh
$ chmod 755 site site/css site/deploy.sh
$ chmod 644 site/index.html site/css/main.css
$ stat -c '%a %A %n' site site/css site/index.html site/css/main.css site/deploy.sh
755 drwxr-xr-x site
755 drwxr-xr-x site/css
644 -rw-r--r-- site/index.html
644 -rw-r--r-- site/css/main.css
755 -rwxr-xr-x site/deploy.shItulah tata letak yang diperlukan oleh direktori berisi file statis. Berikut kesalahan rekursif pertama.
$ chmod -R 755 site
$ stat -c '%a %A %n' site/index.html site/css/main.css
755 -rwxr-xr-x site/index.html
755 -rwxr-xr-x site/css/main.cssTidak ada yang rusak, dan itulah masalahnya. Kesalahan ini tidak terlihat sehingga bertahan dalam instruksi yang disalin selama bertahun-tahun. Dua file data kini dianggap sebagai program. Git menyimpan bit eksekusi, sehingga commit berikutnya membawa perubahan ini kepada semua orang yang melakukan clone repositori, dan rsync serta tar membawanya ke setiap mesin tempat Anda menyalin hierarki tersebut.
Kesalahan rekursif kedua terlihat jelas. Terapkan mode tanpa bit eksekusi pada direktori, dan direktori tersebut tidak dapat diakses.
$ chmod 644 site
$ stat -c '%a %A %n' site
644 drw-r--r-- site
$ echo site/*
site/css site/deploy.sh site/index.html
$ cd site
bash: cd: site: Permission denied
$ cat site/index.html
cat: site/index.html: Permission deniedNama file masih dapat ditampilkan karena bit baca tetap ada, tetapi setiap path melalui direktori tersebut tertutup karena bit eksekusi tidak ada. chmod -R 644 site melakukan hal itu pada setiap direktori dalam hierarki dengan satu perintah. Hasilnya juga tidak selalu seragam karena chmod harus menelusuri direktori yang akses traversal-nya sedang dihapus, jadi periksa hasil yang benar-benar diterapkan dengan find site -type d -exec stat -c '%a %n' {} +, bukan berasumsi. Pulihkan kondisi ini sebelum melanjutkan.
$ chmod 755 site
$ chmod 644 site/index.html site/css/main.css
$ stat -c '%a %A %n' site site/index.html
755 drwxr-xr-x site
644 -rw-r--r-- site/index.htmlchmod rekursif tidak memiliki fungsi undo. chmod tidak mencatat perubahan yang ditimpanya, sehingga Anda harus memperbaikinya sendiri dengan membangun ulang mode berdasarkan perkiraan kondisi sebelumnya. Pekerjaan ini sama lambat dan tidak pastinya dengan memulihkan file setelah rm -rf yang tidak disengaja, dan pelajarannya juga sama: periksa target perintah rekursif sebelum menekan Enter.
X kapital: execute pada direktori, bukan pada setiap file
Mode simbolis menerima X maupun x. X menetapkan bit execute hanya di tempat yang sesuai: pada direktori atau pada file biasa yang sudah memiliki bit execute untuk salah satu kelas. Aturan ini persis seperti aturan yang Anda inginkan agar diikuti oleh -R.
$ chmod -R u=rwX,go=rX site
$ stat -c '%a %A %n' site site/css site/index.html site/css/main.css site/deploy.sh
755 drwxr-xr-x site
755 drwxr-xr-x site/css
644 -rw-r--r-- site/index.html
644 -rw-r--r-- site/css/main.css
755 -rwxr-xr-x site/deploy.shSatu perintah sudah cukup. Direktori tetap dapat ditelusuri, sedangkan file data tidak berubah. Script tetap memiliki bit execute karena sebelumnya sudah memilikinya. Ini adalah bagian kedua dari aturan X. X membaca mode yang sedang dimiliki file, sehingga file yang sudah kehilangan semua bit execute tidak dapat memulihkannya dengan perintah tersebut.
$ chmod 644 site/deploy.sh
$ chmod -R u=rwX,go=rX site
$ stat -c '%a %A %n' site/deploy.sh
644 -rw-r--r-- site/deploy.sh
$ site/deploy.sh
bash: site/deploy.sh: Permission denied
$ chmod u+x site/deploy.sh
$ stat -c '%a %A %n' site/deploy.sh
744 -rwxr--r-- site/deploy.sh
$ site/deploy.sh
hiAturan yang sama berlaku sebaliknya. X dapat menerapkan bit execute yang sudah dimiliki file kepada kelas lain:
$ chmod go+X site/deploy.sh
$ stat -c '%a %A %n' site/deploy.sh
755 -rwxr-xr-x site/deploy.shJadi, x huruf kecil digunakan untuk satu file tertentu yang ingin Anda jadikan dapat dijalankan, sedangkan X digunakan untuk penelusuran pada seluruh tree. Jika Anda memerlukan mode yang tepat untuk setiap jenis objek, bukan aturan berdasarkan mode saat ini, pisahkan penelusuran dengan find.
find site -type d -exec chmod 755 {} +
find site -type f -exec chmod 644 {} +
chmod u+x site/deploy.sh-type d memilih direktori dan -type f memilih file biasa, sehingga setiap jenis memperoleh mode yang sesuai. -exec ... + mengelompokkan banyak path ke dalam satu pemanggilan chmod, bukan memulai satu proses untuk setiap file. Hal ini penting pada tree yang memiliki ribuan entri. Script mendapatkan kembali bit tersebut pada baris terpisah, secara sengaja.
Periksa hasilnya sebelum meninggalkan sistem
Dua perintah dapat menemukan kesalahan penting setelah perubahan rekursif. Perintah pertama menampilkan direktori yang tidak lagi dapat Anda akses.
find . -type d ! -perm -u+xPerintah kedua menampilkan file yang dapat diedit oleh akun apa pun pada mesin.
find . -type f -perm -o+wDalam -perm -o+w, - di awal berarti setidaknya bit-bit ini, sehingga perintah tersebut mencocokkan file yang kelas o-nya memiliki bit tulis, terlepas dari bit lain yang ditetapkan. Hasil yang Anda inginkan adalah kedua perintah tersebut tidak menampilkan apa pun. Jalankan keduanya dari direktori teratas pada pohon apa pun yang baru saja Anda ubah dengan -R, lalu jalankan stat -c '%a %A %n' pada beberapa path yang memang ingin Anda ubah, sehingga mode yang Anda yakini telah ditetapkan benar-benar merupakan mode yang disimpan kernel.
FAQ
Apa perbedaan antara chmod 755 dan chmod u+x?
Mode numerik bersifat absolut. Mode ini menulis setiap bit izin pada file, sehingga kelas izin yang tidak Anda pertimbangkan juga ditulis ulang. Mode simbolis adalah pengeditan. u+x menambahkan satu bit untuk owner dan membiarkan bit lainnya tetap seperti semula. Gunakan bentuk numerik jika Anda mengetahui kondisi akhir yang tepat untuk file tersebut. Gunakan bentuk simbolis jika Anda ingin menambahkan atau menghapus satu izin. Jalankan stat -c '%a %A %n' <file> sebelum dan sesudah salah satu perintah tersebut. Perbedaannya akan terlihat pada output.
Mengapa chmod -R 755 pada direktori berisi file web merupakan ide yang buruk?
Karena -R menerapkan mode absolut yang sama pada direktori dan regular file, padahal keduanya memerlukan bit yang berbeda. Direktori memerlukan bit execute agar dapat ditelusuri. File data seperti HTML dan CSS tidak memerlukannya. Menandainya sebagai executable merupakan perubahan yang akan dicatat git pada commit berikutnya dan disalin rsync ke mesin berikutnya. Gunakan chmod -R u=rwX,go=rX <dir> agar bit execute hanya diterapkan pada direktori, atau gunakan find dengan -type d dan -type f agar setiap jenis file mendapatkan modenya sendiri.
Apa fungsi bit execute pada direktori?
Bit tersebut memberikan izin traversal, bukan izin eksekusi. Tidak ada sesuatu di dalam direktori yang dapat dijalankan. Bit execute memberikan izin untuk me-resolve nama di dalam direktori. Karena itu, Anda memerlukannya pada setiap direktori di sepanjang path sebelum dapat membuka file di akhir path tersebut. Bit read berbeda dan memberikan izin untuk menampilkan daftar nama. Anda dapat memiliki salah satunya tanpa yang lain: dengan hanya bit execute, Anda dapat membuka file yang namanya sudah diketahui, tetapi shell tidak dapat memperluas glob di direktori tersebut. Dengan hanya bit read, Anda dapat melihat nama-namanya, tetapi setiap upaya untuk membuka salah satunya akan gagal.
Kapan saya harus menggunakan X kapital, bukan x huruf kecil?
Gunakan X setiap kali perintah dijalankan secara rekursif. X menetapkan bit execute pada direktori dan pada regular file hanya jika salah satu bit execute sudah ditetapkan. Dengan demikian, satu kali proses dapat membuat sebuah tree dapat ditelusuri tanpa mengubah file data menjadi program. Gunakan x huruf kecil ketika Anda menunjuk satu file dan memang bermaksud mengubah file tersebut. Ada satu batasan yang perlu diingat: X tidak dapat memulihkan bit execute yang sudah dihapus dari semua file, karena tidak ada lagi bit execute yang dapat dijadikan acuan. Tetapkan kembali bit tersebut dengan chmod u+x <file>.
Apakah chmod mengubah pemilik file?
Tidak. chmod hanya mengubah bit izin. Kepemilikan ditentukan oleh chown untuk user dan chgrp untuk group. Mengalihkan file kepada user lain memerlukan root. Hal ini penting karena bit izin dibaca berdasarkan owner dan group yang tercatat pada file, bukan berdasarkan pihak yang terakhir menulisnya. Jalankan stat -c '%U %G %a %n' <file> untuk melihat owner, group, dan mode secara bersamaan sebelum menentukan perintah mana dari ketiganya yang sebenarnya Anda perlukan.